perl 将函数解包到 python

Posted

技术标签:

【中文标题】perl 将函数解包到 python【英文标题】:perl unpack function to 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 字符长的字符串。

【问题讨论】:

【参考方案1】:

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

    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',不过会很好。

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

【讨论】:

以上是关于perl 将函数解包到 python的主要内容,如果未能解决你的问题,请参考以下文章

将数组参数直接解包到参数?

将 JSON 行解包到 pandas 数据框

Python将包含列表元组的字符串解包到变量

将字典解包到单个 DataFrame 中

python:将字符串解包到列表中

“W”在 Perl 的解包函数中究竟做了啥?