目錄
struct庫簡要說明
struct方法
struct.pack()
struct.unpack()
struct.calcsize(format:str)
format參數的用法
字節順序/大小/對齊
struct
模塊提供了用於在字節字符串和Python原生數據類型之間轉換函數,比如數字和字符串,使用Python中的f.write()函數寫文件時,參數只能是字符串,操作純數字寫入時,不方便,這時候就輪到struct登場了。
該模塊作用是完成Python數值和C語言結構體的Python字符串形式間的轉換。
這可以用於處理存儲在文件中或從網絡連接中存儲的二進制數據,以及其他數據源。
准確地講,Python沒有專門處理字節的數據類型。但由於
b'str'
可以表示字節,所以,字節數組=二進制str。而在C語言中,我們可以很方便地用struct、union來處理字節,以及字節和int,float的轉換。故提供一個庫來做轉換。
pack(format, v1, v2, ...) -> bytes 將字符串或者數字,按照format指定的格式轉換為bytes數據返回unpack(fmt, string):返回一個元組,其中包含根據格式字符串解包的值。calcsize(fmt):返回由格式字符串描述的結構的大小(以字節為單位)。
如下定義一個16進制字符串,將該字符串轉換為int值後,使用struct.pack()函數,按照有符號的int16類型,將數據寫入到文件中,循環寫入300次相同的數值。
import struct
a = '4FFF'
b = int(a, 16)
with open('test.bin', 'wb') as f:
for x in range(300):
f.write(struct.pack('h', b))
使用16進制編輯器查看該文件,驗證
struct.unpack(f'{data_num}h', f.read()),這裡注意,文件中有多少數據,fmt的格式就需要多個,返回的結果是一個元組。
import struct
data_num = 300
with open('test.bin', 'rb') as f:
print(struct.unpack(f'{data_num}h', f.read()))
按format的格式計算這個格式本占用的字節數大小。
import struct
# B是1個字節,H是2個字節,I是4個字節,共7個字節
print(struct.calcsize('<BHI'))
print(struct.calcsize('h'))
print(struct.calcsize('H'))
print(struct.calcsize('i'))
print(struct.calcsize('c'))
print(struct.calcsize('b'))
默認情況下,pack是使用本地C庫的字節順序來編碼的。格式化字符串的第一個字符可以用來表示填充數據的字節順序、大小和對齊方式,如下表所描述的:
@
nativenative湊足4個字節=
nativestandard不作變化<
little-endianstandard不作變化>
big-endianstandard不作變化!
network (= big-endian)standard不作變化參考:
Python使用struct庫的用法小結_python_腳本中心 - 編程客棧
Python標准庫筆記(6) — struct模塊 - 知乎