繁体   English   中英

用struct.unpack读取4个字节

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM