使用python3时的奇怪字节长度struct.pack()

时间:2015-11-16 10:45:52

标签: python struct

我正在编写一个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}}

这里发生了什么?

2 个答案:

答案 0 :(得分:4)

根据文档,指定字节顺序会删除任何填充:

  

使用非原生大小和对齐时,不添加填充,例如使用'<','>','='和'!'。

因此,假设您需要小端包装,以下提供所需的输出:

>>> struct.pack('<Hf', id1, i)
'\x01\x00\x18\x1c\x14?'

请注意<。 (3f可以编码为ASCII ?,因此可以替代)

答案 1 :(得分:1)

struct.pack()根据长度对齐值,因此4字节值始终从可被4整除的索引开始。如果您像第二个示例中那样以块的形式写入数据,则此填充可以&# 39,显然。

正如您链接的文档所说:

  

默认情况下,C编号以机器的本机格式和字节顺序表示,并在必要时通过跳过填充字节进行正确对齐(根据C编译器使用的规则)。