Python 3.7.0-结构计算,错误或功能



我尝试解开字节值列表。我想阅读并解开它们,但我遇到了这个东西...

当我们计算串联字符串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对其结构相同的填充规则。因此,填充字节发生在3B2H之间(因为H是两个字节对齐),另一个是1B4H

根据文档:

注意:默认情况下,打包给定的C结构的结果包括垫子字节,以维持所涉及的C类型的适当对齐;同样,解开包装时也要考虑对齐。选择此行为,以使包装结构的字节完全与相应C结构的内存完全对应。要处理独立于平台的数据格式或省略隐式键盘字节,请使用standard大小和对齐方式而不是native大小和对齐方式:请参阅字节顺序,大小和对齐方式有关详细信息。

因此,只需使用非默认尺寸/对齐方式即可在适当的情况下"修复"此操作。

最新更新