Python?Struct庫之pack和unpack舉例詳解
1. 官網(wǎng)解析
首先是官網(wǎng)對于 pack
、 unpack
、calcsize
以及 Format Strings
的描述
1.1 pack、unpack、calcsize
struct.pack
返回一個 bytes
對象,其中包含根據(jù)格式字符串 format
打包的值 v1, v2,…
參數(shù)必須與格式所要求的值完全匹配
struct.unpack
根據(jù)格式字符串 format
從緩沖區(qū) buffer
(假設由pack(format,…)打包)中解包。返回一個元組,即使它只包含一個元素。緩沖區(qū)的字節(jié)大小必須與格式所需的大小匹配,如 calcsize()
所反映的那樣。
struct.calcsize
返回與格式字符串 format
對應的結(jié)構(gòu)體(以及由 pack(format,…)生成的 bytes 對象)的大小。
1.2 Format Strings
這一段在官方的描述中很詳細,同時也很長,這里我只放幾個重要的地方,剩下的可以自行去官網(wǎng)查閱
格式字符串描述打包和拆包數(shù)據(jù)時的數(shù)據(jù)布局。它們由格式字符組成,格式字符指定打包/解包的數(shù)據(jù)類型。此外,特殊字符控制字節(jié)順序、大小和對齊方式。每個格式字符串由一個可選的前綴字符(描述數(shù)據(jù)的總體屬性)和一個或多個格式字符(描述實際數(shù)據(jù)值和填充)組成。
1.2.1 字節(jié)順序、大小和對齊方式
默認情況下,C 語言的類型以機器的本機格式和字節(jié)順序表示,并在必要時通過填充字節(jié)來正確對齊(根據(jù) C 語言編譯器使用的規(guī)則)。選擇這種行為是為了使打包結(jié)構(gòu)體的字節(jié)與相應的 C 語言的結(jié)構(gòu)體的內(nèi)存布局完全對應。是使用本機字節(jié)排序和填充還是標準格式取決于應用程序。格式字符串的第一個字符可以用來指示字節(jié)順序、大小和打包數(shù)據(jù)的對齊方式,如下表所示:
1.2.2 格式字符
格式字符有以下含義:給定 C 和 Python 值的類型,它們之間的轉(zhuǎn)換應該是顯而易見的。Standard size
列是指使用Standard size
時,以字節(jié)為單位的打包值的大小;也就是說,當格式字符串以 <
,>
,!
或=
開頭的時候(詳情見上面一個表格的 Size
列)。當使用 native size
時,打包值的大小取決于平臺。
2. pack 解析
pack會把給定的數(shù)據(jù)按照 format string
的方式去打包我們來看看例子
例子 1
from struct import * print(pack(">bhl", 1, 2, 3))
這里 format string
為 >bhl
,其中 >
代表采用大端(高位字節(jié)在前)的方式打包, b
、h
、l
分別代表采用 signed char
、short
、long
(對于 C 語言)的數(shù)據(jù)類型來分別打包 1
、2
、3
,他們分別占用 1 字節(jié)、2 字節(jié)和 4 字節(jié),下圖是運行的結(jié)果。b
開頭表示是字節(jié)類型,輸出的結(jié)果和我們分析的結(jié)果一致
例子 2
from struct import * print(pack("<2hl", 1, 2, 3))
這里 format string
為 <2hl
,其中 <
代表采用小端(低位字節(jié)在前)的方式打包, 2h
代表前面 2 個數(shù)據(jù)采用 signed short
類型、進一步的,我們可以使用 x+格式字符
來表示,后續(xù) x
個字符都用此格式字符來打包
下圖是運行的結(jié)果:b
開頭表示是字節(jié)類型,輸出的結(jié)果和我們分析的結(jié)果一致。
例子 3
注意下面代碼的運行結(jié)果
from struct import * print(pack("@3c", b'1', b'2', b'3')) print(pack("@1s", b'123')) print(pack("@2s", b'123')) print(pack("@3s", b'123'))
這一段代碼主要是 format string
的不同導致了打包的結(jié)果和入?yún)⒉煌?,其?nbsp;c
是以 char
類型去打包,3c
是代表后續(xù)的 3 個參數(shù)全部按照 char
去打包,而 s
是以 char[]
類型去打包,而 s
前面的數(shù)字則是代表打包多少位
3. unpack 解析
unpack 可以理解為是 pack 的逆向,直接看例子
例子1
from struct import * print(unpack(">bhl",pack(">bhl", 1, 2, 3)))
將上面第一個例子的輸出作為unpack的參數(shù)輸入,然后按照和打包一樣的 format string
去進行解包我們可以得到如下的結(jié)果,與我們的輸入是一致的。
當然,在很多場景下并不是像這樣自己打包數(shù)據(jù)然后再自己解包,而是需要按照一定的協(xié)議去解來自其他地方的字節(jié)流,于是可以這樣寫,在 data
中換成需要解包的數(shù)據(jù),然后根據(jù)包的協(xié)議(字節(jié)順序、大小和對齊方式)來編寫解包的 format string
from struct import * data = b'\x01\x00\x02\x00\x00\x00\x03' print(unpack('>bhl', data))
總結(jié)
到此這篇關于Python Struct庫之pack和unpack的文章就介紹到這了,更多相關Python Struct庫pack和unpack內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python+seaborn實現(xiàn)聯(lián)合分布圖的繪制
聯(lián)合分布(Joint Distribution)圖是一種查看兩個或兩個以上變量之間兩兩相互關系的可視化圖,在數(shù)據(jù)分析操作中經(jīng)常需要用到。本文將通過seaborn實現(xiàn)繪制聯(lián)合分布圖,需要的可以參考一下2023-02-02Python爬蟲實現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例
這篇文章主要為大家介紹了Python爬蟲實現(xiàn)爬取下載網(wǎng)站數(shù)據(jù)的幾種方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11