在Python中构造和解包

时间:2014-05-13 14:53:55

标签: python struct

我一直在努力了解拆包的工作原理。更具体地说,文档中的这个具体示例让我感到困惑,因为当我输入完全相同时,它不会给我相同的输出。 https://docs.python.org/2/library/struct.html#struct-examples

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

8字节大小是有意义的但是当我做calcsize('hhl')它返回16.存储pack('hhl',1,2,3)作为变量并解压缩它工作正常但是使用十六进制值不。我收到错误“unpack需要一个长度为16的字符串参数”,任何想法是什么问题?感谢

2 个答案:

答案 0 :(得分:2)

这是因为当你这样做时:

>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'

它没有返回包含[\x0,...]的字符串,而是包含以十六进制给出的每个数字的字节数组:

>>> pack('hhl', 1, 2, 3)[0]
'\x00'

所以,当你在做的时候:

>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')

你实际上正试图像我之前说的那样解压缩字符串。如果你这样做:

>>> s = pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', s)
(1, 2, 3)

它按预期工作。

现在正如@falstru所说的那样,将带有十六进制的字符串转换为struct可以理解的bytearray的方法是使用binascii.unhexlify来处理字节序和转换。你也可以自己做:

>>> unpack('hhl', str(bytearray([1,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0])))
(1, 2, 3)

答案 1 :(得分:1)

如果您指的是'0001000200000003'之类的十六进制字符串,则需要首先使用binascii.unhexlify(或binascii.a2b_hex

取消它。
>>> import struct
>>> import binascii
>>> struct.unpack('>hhl', binascii.unhexlify('0001000200000003'))
(1, 2, 3)