[英]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.