1. 程式人生 > >Python的內建模組struct學習筆記

Python的內建模組struct學習筆記

python處理二進位制資料時可以使用python的struct模組。

struct模組中最重要的三個函式是pack(), unpack(), calcsize():

pack(fmt, v1, v2, ...)     按照給定的格式(fmt),返回一個包裝後的字串

unpack(fmt, string)       按照給定的格式(fmt)解析位元組流string,返回一個解析出來的tuple

calcsize(fmt)                 計算給定的格式(fmt)佔用多少位元組的記憶體。

struct中支援的格式如下表:

可以用格式(fmt)中的第一個字元來改變對齊方式。定義如下:

如果沒有附加,預設為@。

例子如下:

>>> import struct
>>> a = struct.pack('ihb',1,2,3)
>>> a
b'\x01\x00\x00\x00\x02\x00\x03'
>>> b = struct.unpack('ihb',a)
>>> b
(1, 2, 3)

首先將引數1,2,3打包。

打包前1,2,3明顯屬於python資料型別中的integer,打包後就成了C結構的二進位制串。

轉成python的string型別來顯示就是'\x01\x00\x00\x00\x02\x00\x03'。由於本機是小端因此高位放在低地址段。

i:代表C結構中的int型別,佔4位,表示為01000000;
h:代表C結構中的short型別,佔2位,表示為0200;
b:代表C結構中的signed char型別,佔1位,表示為03。

再來看一個例子:

>>> a = struct.pack('!ihb',1,2,3)
>>> a
b'\x00\x00\x00\x01\x00\x02\x03'
>>> b = struct.unpack('!ihb',a)
>>> b
(1, 2, 3)

使用的format string中首位為'!',即為大端模式標準對齊方式。

故而輸出為'\x00\x00\x00\x01\x00\x02\x03',其中高位就被放在記憶體的高地址位了。