Python struct.error:解包需要长度为4的字符串参数
Python说我需要4个字节的“BH”格式代码: 这是代码,我输入了我认为需要的3个字节:Python struct.error:解包需要长度为4的字符串参数,python,struct,Python,Struct,Python说我需要4个字节的“BH”格式代码: 这是代码,我输入了我认为需要的3个字节: major, minor = struct.unpack("BH", self.fp.read(3)) “B”无符号字符(1字节)+“H”无符号短字符(2字节)=3字节(!?) 结构calcsize(“BH”)表示4个字节 编辑:文件大小约为800 MB,位于文件的前几个字节中,因此我相当确定还有数据要读取。默认情况下,在许多平台上,短字符将以2的倍数对齐偏移量,因此在字符后会添加一个填充字节 要禁用此
major, minor = struct.unpack("BH", self.fp.read(3))
“B”无符号字符(1字节)+“H”无符号短字符(2字节)=3字节(!?)
结构calcsize(“BH”)表示4个字节
编辑:文件大小约为800 MB,位于文件的前几个字节中,因此我相当确定还有数据要读取。默认情况下,在许多平台上,短字符将以2的倍数对齐偏移量,因此在字符后会添加一个填充字节 要禁用此功能,请使用:
struct.unpack(“=BH”,data)
。这将使用标准对齐,不添加填充:
>>> struct.calcsize('=BH')
3
=
字符将使用本机字节顺序。您还可以使用
而不是=
分别强制小端字节或大端字节排序。结构模块模拟C结构。处理器读取奇数地址上的16位字或不能被4整除的地址上的32位dword需要更多的CPU周期,因此结构会添加“pad字节”,使结构成员落在自然边界上。考虑:
struct { 11
char a; 012345678901
short b; ------------
char c; axbbcxxxdddd
int d;
};
此结构将占用12个字节的内存(x为pad字节)
Python的工作原理类似(请参阅文档):
编译器通常有一种消除填充的方法。在Python中,任何=!将消除填充:
>>> struct.calcsize('=BHBL')
8
>>> struct.pack('=BHBL',1,2,3,4)
'\x01\x02\x00\x03\x04\x00\x00\x00'
小心让结构处理填充。在C中,这些结构:
struct A { struct B {
short a; int a;
char b; char b;
}; };
通常分别为4字节和8字节。在数组中使用结构的情况下,填充发生在结构的末尾。这将使“a”成员在阵列中稍后的结构的正确边界上对齐。Python的结构模块不会在末尾填充:
>>> struct.pack('LB',1,2)
'\x01\x00\x00\x00\x02'
>>> struct.pack('LBLB',1,2,3,4)
'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04'
奇怪的是,我用十六进制查看我的文件,我有数据01 01 00,其中显示了版本的三个字节:一个“主”字节和一个“次”短字节。那么这种说法是假的吗?解包(“BH”,pack(“BH”,3,6))==(3,6)谢谢你的帮助。@Thomas:我不知道你到底在问什么。你发布的表达式将评估为真。这就是我的想法,也是我正在做的。我使用Python打包一个简单的数据库,使用pack(“BH”,major\u ver,minor\u ver),然后使用unpack(“BH”)解包。在与Intel C2D x86-64相同的计算机上。额外的字节从哪里来?我将使用=BH,但有人怀疑某个字节在某处丢失或获得了。我想知道的是,为什么Python最初没有以这种格式打包数据。“01 01 00”是压缩字节0x01,短0x01,但它试图像“01 00 01 00”一样解包。不管怎样,我解决了我的问题,我总是加上“有一个类似的问题,'='或'@'没有解决。。。使用我在mac上做的代码windows@ThomasO你为什么说它包装成“01 01 00”?我看到struct.pack('BH',1,2)='\x01\x00\x02\x00'。@aij padding被添加,除非您使用一个endian选项
=代码>@MarkTolonen是的,我也看到了。我只是想知道为什么ThomasO说pack
没有添加填充物。
struct A { struct B {
short a; int a;
char b; char b;
}; };
>>> struct.pack('LB',1,2)
'\x01\x00\x00\x00\x02'
>>> struct.pack('LBLB',1,2,3,4)
'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04'