python - 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)
可能是我不明白的东西?
解决方案
在“本机”字节顺序(默认)中,struct
模块应用与 C 相同的填充规则到其结构。所以一个填充字节出现在3B
and之间2H
(因为H
是两个字节对齐),另一个在1B
and之间4H
。
根据文档:
注意:默认情况下,打包给定 C 结构的结果包括填充字节,以保持所涉及的 C 类型的正确对齐;同样,开箱时也会考虑对齐。选择此行为是为了使打包结构的字节与相应 C 结构的内存布局完全对应。要处理与平台无关的数据格式或省略隐式填充字节,请使用
standard
大小和对齐而不是native
大小和对齐:有关详细信息,请参阅字节顺序、大小和对齐。
因此,如果合适,只需使用非默认大小/对齐来“修复”这个问题。
推荐阅读
- java - 在 JavaFX 中切换视图
- java - 使用代码查找 10 个随机整数数组的平均值时遇到问题
- c# - WebForm 等待用户在文本框中完成输入
- javascript - Zomato-API 表现出奇怪的不同 api 调用
- javascript - 从 api 获取所有数据并插入 HTML
- javascript - Bootstrap Modal - 简单的密码保护按钮
- javascript - 渲染保存在后端并从后端返回的 HTML?
- zfs - 检测最新快照上的任何更改
- python - 获取类型错误:“系列”对象是可变的,因此当使用函数将列中的 int 转换为季节时,它们不能被散列
- c# - 如何捕获整个窗口的异常