首页 > 解决方案 > Python 3.7.0 - 结构 calcsize、错误或功能?

问题描述

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

当我们计算连接字符串 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)

可能是我不明白的东西?

标签: pythonparsingstructpackunpack

解决方案


在“本机”字节顺序(默认)中,struct模块应用与 C 相同的填充规则到其结构。所以一个填充字节出现在3Band之间2H(因为H是两个字节对齐),另一个在1Band之间4H

根据文档

注意:默认情况下,打包给定 C 结构的结果包括填充字节,以保持所涉及的 C 类型的正确对齐;同样,开箱时也会考虑对齐。选择此行为是为了使打包结构的字节与相应 C 结构的内存布局完全对应。要处理与平台无关的数据格式或省略隐式填充字节,请使用standard大小和对齐而不是native大小和对齐:有关详细信息,请参阅字节顺序、大小和对齐

因此,如果合适,只需使用非默认大小/对齐来“修复”这个问题。


推荐阅读