【问题标题】:Structs and unpacking in PythonPython中的结构和解包
【发布时间】:2014-05-13 14:53:55
【问题描述】:

我一直在努力理解拆包的工作原理。更具体地说,文档中的这个特定示例最让我困惑,因为当我输入完全相同时,它不会给我相同的输出。 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) 存储为变量并解压缩它可以正常工作,但使用十六进制值不会.我收到错误“解包需要长度为 16 的字符串参数”,知道问题出在哪里吗?谢谢

【问题讨论】:

  • 文档指出该示例是在大端机器上完成的。请注意,大多数 (?) 流行的处理器使用 little-endian 字节排序,因此输出字符串可能不同。只要你解包用 pack 生成的字符串,你就可以了。您还可以强制执行特定的字节排序(请参阅文档)。
  • 是的,这就是问题所在。将其格式化为 big-endian 给出了我期望的结果

标签: python struct


【解决方案1】:

这是因为当你这样做时:

>>> 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)

【讨论】:

    【解决方案2】:

    如果你的意思是像'0001000200000003'这样的十六进制字符串,你需要先用binascii.unhexlify(或binascii.a2b_hex)解开它

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多