首页 > 解决方案 > struct.pack 比它的部分长?

问题描述

我想解压 6 个值: 2 * UInt16、 1 * UInt32、 1 * UInt16、 2 *Int64

以字节为单位添加大小,我得到 26。

但是python似乎认为应该是32:

>>> a = struct.pack("H",0)
>>> len(a)
2 <-- correct
>>> a = struct.pack("L",0)
>>> len(a)
4 <-- correct
>>> a = struct.pack("q",0)
>>> len(a)
8 <-- correct
>>> a = struct.pack("HHLHqq",0,0,0,0,0,0)
>>> len(a)
32 < -- should be 2 + 2 + 4 + 2 + 8 + 8 = 26 
>>> a = struct.pack("HHLHq",0,0,0,0,0)
>>> len(a)
24 < -- should be 2 + 2 + 4 + 2 + 8 = 18
>>> a = struct.pack("HHLH",0,0,0,0)
>>> len(a)
10 <-- correct again

struct.unpack有同样的问题,需要 32 字节来解压“HHLHqq”。但是,在我的应用程序中,数据是从外部源发送的,只有 26 个字节。

我可以将它一个一个解包作为一种解决方法,但是必须有一种方法可以肯定地禁用此填充?

标签: pythonbinarypack

解决方案


根据:https ://docs.python.org/2/library/struct.html

使用非本机大小和对齐方式时不添加填充,例如使用 '<'、'>'、'=' 和 '!'。

所以你只需要指定字节顺序,填充就会消失:

>>> import struct
>>> len(struct.pack("HHLHqq",0,0,0,0,0,0))
40
>>> len(struct.pack("<HHLHqq",0,0,0,0,0,0))
26
>>> 

推荐阅读