python struct解包长度错误

时间:2017-12-11 09:45:28

标签: python python-3.x

我有一个长度为41的字节对象。我试着用以下方法解压缩它:

struct.unpack('2B2B32sBi',data)

但是我收到了一个错误:

  

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

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

3 个答案:

答案 0 :(得分:3)

请参阅documentation有关对齐的部分:

  

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

  

使用C编译器的sizeof表达式确定本机大小和对齐方式。这总是与本机字节顺序相结合。

  

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

为了说明这一点:

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

答案 1 :(得分:2)

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

来自documentation

  

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

所以你指定一个禁用填充的字节序:

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

编辑完整性,在阅读了Galen的优秀答案之后:如果您不想强制使用endianness,只需指定=即可。

答案 2 :(得分:0)

您可能想再次阅读struct documentation中的第一个音符。 默认值是C对齐的数据边界,因此一些填充字节负责差异。因此,添加适当的字节顺序可以解决问题。