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。
我正在尝试使用 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。