我正在编写一个python3脚本,将一些数字写为二进制文件。在做的时候我发现了一些非常奇怪的东西例如,以下python代码写一个" unsign short"和一个"浮动"编号到tmp文件:
01 00 00 00 18 1c 14 3f
根据docs" H" (unsigned short)是2个字节," f"(float)是4个字节。所以我期待一个6字节的文件,但是输出是一个8字节的数据:
struct.calcsize(fmt)
如
所示data = struct.pack('H', id1)
f.write(data)
data = struct.pack('f', i)
f.write(data)
表示" Hf"是8字节大小
如果我单独进行,例如
01 00 18 1c 14 3f
然后输出是一个预期的6字节文件:
{{1}}
这里发生了什么?
答案 0 :(得分:4)
根据文档,指定字节顺序会删除任何填充:
使用非原生大小和对齐时,不添加填充,例如使用'<','>','='和'!'。
因此,假设您需要小端包装,以下提供所需的输出:
>>> struct.pack('<Hf', id1, i)
'\x01\x00\x18\x1c\x14?'
请注意<
。 (3f
可以编码为ASCII ?
,因此可以替代)
答案 1 :(得分:1)
struct.pack()
根据长度对齐值,因此4字节值始终从可被4整除的索引开始。如果您像第二个示例中那样以块的形式写入数据,则此填充可以&# 39,显然。
正如您链接的文档所说:
默认情况下,C编号以机器的本机格式和字节顺序表示,并在必要时通过跳过填充字节进行正确对齐(根据C编译器使用的规则)。