我一直在努力了解拆包的工作原理。更具体地说,文档中的这个具体示例让我感到困惑,因为当我输入完全相同时,它不会给我相同的输出。 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的字符串参数”,任何想法是什么问题?感谢
答案 0 :(得分:2)
这是因为当你这样做时:
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
它没有返回包含[\
,x
,0
,...]的字符串,而是包含以十六进制给出的每个数字的字节数组:
>>> 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)