我有一个长度为41的字节对象。我试着用以下方法解压缩它:
struct.unpack('2B2B32sBi',data)
但是我收到了一个错误:
struct.error:unpack需要一个长度为44的字节对象
在检查python文档后,我认为2B2B32sBi
的长度应为2*1+2*1+32*1+1+4=41
。为什么我错了?
答案 0 :(得分:3)
请参阅documentation有关对齐的部分:
默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过跳过填充字节进行正确对齐(根据C编译器使用的规则)。
使用C编译器的sizeof表达式确定本机大小和对齐方式。这总是与本机字节顺序相结合。
注意' @'之间的区别和' =':都使用本机字节顺序,但后者的大小和对齐是标准化的。
为了说明这一点:
>>> import struct
>>> struct.calcsize("2B2B32sBi")
44
>>> struct.calcsize("@2B2B32sBi")
44
>>> struct.calcsize("=2B2B32sBi")
41
答案 1 :(得分:2)
您刚刚遇到 padding ,因为您先获得了字节数据,然后是整数(具有更强的对齐约束)
填充仅在连续的结构成员之间自动添加。在编码结构的开头或结尾没有添加填充。
所以你有指定一个禁用填充的字节序:
struct.unpack('<2B2B32sBi',data)
编辑完整性,在阅读了Galen的优秀答案之后:如果您不想强制使用endianness,只需指定=
即可。
答案 2 :(得分:0)
您可能想再次阅读struct documentation中的第一个音符。 默认值是C对齐的数据边界,因此一些填充字节负责差异。因此,添加适当的字节顺序可以解决问题。