我尝试从字节解压缩值列表。我想一起阅读和打开它们,但我遇到了这个......
当我们计算连接字符串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)
可能是我不懂东西?
在“本机”字节顺序(默认值)中,struct
模块将与C相同的填充规则应用于其结构。因此填充字节出现在3B
和2H
之间(因为H
是两个字节对齐的),另一个在1B
和4H
之间。
对于the docs:
注意:默认情况下,打包给定C结构的结果包括填充字节,以便维护所涉及的C类型的正确对齐;类似地,在拆包时考虑对齐。选择此行为是为了使压缩结构的字节与相应C结构的内存中的布局完全对应。要处理与平台无关的数据格式或省略隐式填充字节,请使用
standard
大小和对齐而不是native
大小和对齐:有关详细信息,请参阅Byte Order, Size, and Alignment。
因此,如果合适,只需使用非默认大小/对齐来“修复”它。