[英]Reading 4 bytes with struct.unpack
我有一個文件,其字節#11-15持有一個4字節長的整數。 使用struct.unpack
,我想將其讀取為4字節整數。 現在,將PACK_FORMAT設置為8s2s4B2s16B96s40B40B
,我讀取了4個單獨的字節:
PACK_FORMAT = '8s2s4B2s16B96s40B40B'
fd = open('./myfile', 'r')
hdrBytes = fd.read(208)
print(repr(hdrBytes))
foo = struct.unpack(PACK_FORMAT, hdrBytes)
(Pdb) foo[0]
'MAGICSTR'
(Pdb) foo[1]
'01'
(Pdb) foo[2:6]
(48, 50, 48, 48)
(Pdb) print repr(hdrBytes)
'MAGICSTR010200a0000000001e100010........`
現在,我可以將這4個字節轉換為一個int:
(Pdb) int(''.join([chr(x) for x in foo[2:6]]), 16)
512
當我修改PACK_FORMAT
以使用i
而不是4B
來讀取4個字節時,卻總是出現錯誤:
foo = struct.unpack(PACK_FORMAT, hdrBytes)
error: unpack requires a string argument of length 210
您似乎違反了對齊要求:整數必須在計算機的4字節邊界上。
您可以通過以等號開頭的格式字符串來關閉對齊方式:
PACK_FORMAT ='= 8s2si2s16B96s40B40B'
它與對齊有關—請參閱docs 。
import struct
PACK_FORMAT1 = '8s 2s 4B 2s 16B 96s 40B 40B'
print(struct.Struct(PACK_FORMAT1).size) # -> 208
PACK_FORMAT2 = '8s 2s i 2s 16B 96s 40B 40B'
print(struct.Struct(PACK_FORMAT2).size) # -> 210
PACK_FORMAT3 = '=8s 2s i 2s 16B 96s 40B 40B'
print(struct.Struct(PACK_FORMAT3).size) # -> 208
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.