我尝试解开字节值列表。我想阅读并解开它们,但我遇到了这个东西...
当我们计算串联字符串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
。
根据文档:
注意:默认情况下,打包给定的C结构的结果包括垫子字节,以维持所涉及的C类型的适当对齐;同样,解开包装时也要考虑对齐。选择此行为,以使包装结构的字节完全与相应C结构的内存完全对应。要处理独立于平台的数据格式或省略隐式键盘字节,请使用
standard
大小和对齐方式而不是native
大小和对齐方式:请参阅字节顺序,大小和对齐方式有关详细信息。
因此,只需使用非默认尺寸/对齐方式即可在适当的情况下"修复"此操作。