我有一个文件,其字节#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
答案 0 :(得分:2)
看起来你正在违反对齐要求:整数必须在你机器上的4字节边界上。
您可以通过使用等号开始格式字符串来关闭对齐:
PACK_FORMAT =' = 8s2si2s16B96s40B40B'
答案 1 :(得分:1)
它与对齐有关 - 请参阅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