【问题标题】:perl unpack function to pythonperl 将函数解包到 python
【发布时间】:2018-03-22 14:03:19
【问题描述】:

我正在尝试将 Perl 脚本翻译成 Python。

我在翻译这行时遇到了一些麻烦:

my ($sync,$pid,$afccc,@bytes)=unpack('CnCC*',$pkt);

我在 Python 中试过这个

bytes=[]
sync,pid,afccc,bytes=struct.unpack_from('BHBB',pkt)

但是这行后面的变量bytes不是列表,则执行失败。

仅供参考,pkt 是一个 188 字符长的字符串。

【问题讨论】:

    标签: python unpack


    【解决方案1】:

    有两个问题,只有一个在 Python 3 中得到修复:

    1. struct.unpack 不支持任意重复。 (Python 3.4 引入了iter_unpack,但这在这里并没有真正的帮助。)你需要一个精确的 计算每个说明符。你不能写'BHB*B';相反,您需要计算BHB 之后的预期字节数。幸运的是,这并不难或难做:

      header_fmt = struct.Struct('BHB')
      packet_fmt = struct.Struct(header_fmt.format +
                                 '{}B'.format(188 - header_fmt.size))
      # packet_fmt.format == 'BHB183B'
      

      (通常您可能需要使用 len(pkt) 而不是硬编码 188。)

      'BHB*B',不过会很好。

    2. 在 Python 2 中,您必须显式地从数组中提取尾随字节:

      fields = packet_fmt.unpack(pkt)
      sync, pid, afccc = fields[3:]
      bytes = fields[3:]
      

      或者,您可以使用unpack_from 和拼接,因为您不需要解压缩字节,而是提取它们。

      sync, pid, afccc = header_fmt.unpack_from(pkt)
      bytes = pkt[header_fmt.size:]
      

      在 Python 3 中,您可以将 *name 语法与元组解包一起使用。

      sync, pid, afccc, *bytes = packet_fmt.unpack(pkt)
      

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 2013-11-02
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2014-05-17
      • 2018-07-14
      • 2016-11-11
      相关资源
      最近更新 更多