【问题标题】:python struct unpackpython 结构解压
【发布时间】:2011-05-01 15:04:51
【问题描述】:

我正在尝试转换以下 perl 代码:

unpack(.., "Z*")

对于 python,但是 struct.unpack() 中缺少“*”格式修饰符似乎使这不可能。有没有办法在python中做到这一点?

附: perldoc 中 perl 中的“*”修饰符 - 为重复计数提供 * 而不是数字意味着使用剩余的项目,...

所以虽然 python 像 perl 一样有数字重复计数,但它似乎缺少 * 重复计数。

【问题讨论】:

    标签: python perl struct unpack


    【解决方案1】:

    python 的 struct.unpack 没有 Z 格式

    Z  A null-terminated (ASCIZ) string, will be null padded.
    

    我认为

    unpack(.., "Z*")
    

    应该是:

    data.split('\x00')
    

    虽然去除了空值

    【讨论】:

      【解决方案2】:

      我假设您创建了结构数据类型并且知道结构的大小。如果是这种情况,那么您可以创建一个为该结构分配的缓冲区并将值打包到缓冲区中。解包时,您可以使用同一个缓冲区直接解包,只需指定起点即可。

      例如

      import ctypes
      import struct
      s = struct.Struct('I')
      b = ctypes.create_string_buffer(s.size)
      s.pack_into(b, 0, 42)
      s.unpack_from(b, 0)
      

      【讨论】:

      • 不幸的是,struct 数据类型不是由我创建的,但我已经能够对它的某些字段进行逆向工程。
      【解决方案3】:

      您必须自己计算重复次数:

      n = len(s) / struct.calcsize(your_fmt_string)
      f = '%d%s' % (n, your_fmt_string)
      data = struct.unpack(s, f)
      

      我假设your_fmt_string 不会解包多个元素,并且len(s) 完全除以该元素的打包大小。

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 2016-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        相关资源
        最近更新 更多