我一直在努力理解拆包的工作原理。更具体地说,文档中的这个特定示例最让我感到困惑,因为当我完全相同地输入它时,它不会给我相同的输出。 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 requires a string argument of length 16”,知道问题出在哪里吗?谢谢
这是因为当你这样做的时候:
>>> 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 所说,将十六进制字符串转换为结构可以理解的字节数组的方法是使用 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)
我是一名优秀的程序员,十分优秀!