Python 3.7.0-结构calcsize,错误或功能?

时间:2019-02-25 11:42:50

标签: python parsing struct pack unpack

我尝试从字节中解压缩值列表。我想一起阅读并解压它们,但是我遇到了这个东西...

当我们计算串联字符串fmt的大小时,会得到一个结果, 如果我们计算字符串fmt的所有部分的大小并求和,则会得到另一个结果(预期结果)。

from struct import calcsize

f0 = '3B'
f1 = '2H'
f2 = '1B'
f3 = '4H'
f4 = '2B'

print(calcsize(f0) + calcsize(f1) + calcsize(f2) + calcsize(f3) + calcsize(f4))
# 18       (expected) 

print(calcsize(f0 + f1 + f2 + f3 + f4))
# 20       (what?!! o_O)

可能是我听不懂吗?

1 个答案:

答案 0 :(得分:2)

按照“本机”字节顺序(默认),struct模块将与C相同的填充规则应用于其结构。因此,在3B2H之间会出现一个填充字节(因为H是两个字节对齐的),另一个在1B4H之间。

the docs

  

注意:默认情况下,打包给定C结构的结果包括填充字节,以维护所涉及C类型的正确对齐;同样,拆箱时也要考虑对齐方式。选择此行为是为了使打包结构的字节与对应的C结构的内存中的布局完全对应。要处理平台无关的数据格式或忽略隐式填充字节,请使用standard的大小和对齐方式,而不是native的大小和对齐方式:有关详细信息,请参见Byte Order, Size, and Alignment

因此,在适当的情况下,只需使用非默认大小/对齐方式即可“修复”此问题。