Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python struct.error:解包需要长度为4的字符串参数_Python_Struct - Fatal编程技术网

Python struct.error:解包需要长度为4的字符串参数

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的倍数对齐偏移量,因此在字符后会添加一个填充字节 要禁用此

Python说我需要4个字节的“BH”格式代码:

这是代码,我输入了我认为需要的3个字节:

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'