我正在尝试解析包含在这个二进制文件中的一些数据,Python的struct模块导致了各种各样的问题。当它尝试一次执行多种类型时,它似乎不会给我正确的浮点变量:
import struct
# a fragment of the binary file
a = '\x39\x00\xFF\x00\x00\x0A\x00\x1F\x05\xDC\x42\x31\x30\x00\xFF\x00\x00\x0A\x00\xB5\x01\xE6\x42'
struct.unpack_from('1sxHxbxf', a)
# returns ('9', 255, 10, 2.8355782166755716e-09), but
struct.unpack_from('f',a[7:])
# gives the expected (110.01000213623047,)
答案 0 :(得分:8)
默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过跳过填充字节进行正确对齐(根据C编译器使用的规则)。
解包期望浮点数在8字节边界上对齐,并跳过1个填充字节到达那里。您可以通过自己跳过1个字节来确认:
>>> struct.unpack_from('1sxHxbxf', a)
('9', 255, 10, 2.8355782166755716e-09)
>>> struct.unpack_from('f',a[8:])
(2.8355782166755716e-09,)
要禁用对齐,add =
, <
, >
, or !
to the front of the format string。
>>> struct.unpack_from('=1sxHxbxf', a)
('9', 255, 10, 110.01000213623047)