使用struct.unpack读取4个字节

时间:2016-01-06 19:18:50

标签: python struct

我有一个文件,其字节#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

2 个答案:

答案 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