繁体   English   中英

python struct unpack length错误

[英]python struct unpack length error

我有一个长度为41的字节对象。我尝试用以下方法打开它的包装:

struct.unpack('2B2B32sBi',data)

但是我得到一个错误:

struct.error:解压缩需要一个长度为44的字节对象

我认为2B2B32sBi的长度应在检查python文档后为2*1+2*1+32*1+1+4=41 我为什么错了?

请参阅文档中有关对齐的部分:

默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过跳过填充字节来正确对齐(根据C编译器使用的规则)。

使用C编译器的sizeof表达式确定本机大小和对齐方式。 这始终与本机字节顺序结合在一起。

注意'@'和'='之间的区别:两者都使用本机字节顺序,但是后者的大小和对齐方式是标准化的。

为了说明这一点:

>>> import struct
>>> struct.calcsize("2B2B32sBi")
44
>>> struct.calcsize("@2B2B32sBi")
44
>>> struct.calcsize("=2B2B32sBi")
41

您刚遇到填充是因为先获取字节数据,然后获取整数(具有更强的对齐约束)

文档中

仅在连续的结构成员之间自动添加填充。 在编码结构的开头或结尾不添加填充。

因此,您必须指定字节序以禁用填充:

struct.unpack('<2B2B32sBi',data)

阅读了Galen的出色答案后, 为了完整起见,对其进行了编辑 :如果不想强制字节序,仅指定=会更好。

您可能需要再次阅读struct文档中的第一条注释。 默认值是C对齐的数据边界,因此一些填充字节是造成差异的原因。 因此,添加适当的字节顺序应该可以解决该问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM