struct.pack "Hq" 编码大小错误

Wrong encoding size with struct.pack "Hq"

我正在尝试使用 struct.pack 将短(2 字节)和长(8 字节)编码为字节数组,输出的大小为 16 而不是 10:

import struct
print(len(struct.pack('Hq',1,2))) #show 16 and not 10

注意:len(struct.pack('H',1)) 正确 returns 2,len(struct.pack('q',2)) 正确 returns 8

这是 python 错误吗?我正在使用 Python 3.9.5

您可以使用 struct 中的 calcsize 函数来查看基于您使用的格式的大小。

对于Hq

from struct import calcsize

calcsize('Hq')

根据文档:格式字符的顺序可能会影响大小,因为满足对齐要求所需的填充不同。

如果调换顺序,您将得到预期的 10:

from struct import calcsize

calcsize('qH')

这是填充的结果,为与 C code/libraries 实现更好的互操作性而执行(参见 docs. 顶部的注释)。

如果您希望禁用填充,请执行

import struct
print(len(struct.pack('=Hq',1,2)))  # now shows 10

您可以在 docs 中阅读有关 = 和其他特殊格式字符的信息。

这是由于对齐。如果您没有在格式字符串的开头指定任何标志,将使用 @,这是使用“本机对齐”: https://docs.python.org/3/library/struct.html#byte-order-size-and-alignment

以任何其他标志(=、<、> 或 !)开始格式字符串将删除此对齐方式。

calcsize('=Hq') 将按预期 return 10。