为什么我不能用其他类型解包浮点数并获得预期的结果?

时间:2011-06-28 01:11:39

标签: python struct

我正在尝试解析包含在这个二进制文件中的一些数据,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,)

1 个答案:

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