为什么我不能将浮点数与其他类型一起解包并得到预期结果?
我正在尝试从一个二进制文件中提取一些数据,但使用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 个回答
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,)
如果你想关闭这种对齐方式,可以在格式字符串的前面加上 =
、<
、>
或 !
。
>>> struct.unpack_from('=1sxHxbxf', a)
('9', 255, 10, 110.01000213623047)