perl将函数解包到python

perl将函数解包到python,python,perl,unpack,Python,Perl,Unpack,我正在尝试将Perl脚本翻译成Python 翻译这句话我有点困难: my($sync,$pid,$afccc,@bytes)=解包($CnCC*,$pkt); 我在Pyton试过这个 bytes=[] sync,pid,afccc,bytes=struct.unpack_from('BHBB',pkt) 但是变量bytes不是这行后面的列表,那么执行失败 仅供参考,pkt是一个188个字符的长字符串。有两个问题,其中只有一个在Python 3中得到了修复: struct.unpack不支持任

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

翻译这句话我有点困难:

my($sync,$pid,$afccc,@bytes)=解包($CnCC*,$pkt);
我在Pyton试过这个

bytes=[]
sync,pid,afccc,bytes=struct.unpack_from('BHBB',pkt)
但是变量bytes不是这行后面的列表,那么执行失败


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

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

  • struct.unpack
    不支持任意重复。(Python3.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:]
    
    在Python3中,您可以在元组解包时使用
    *name
    语法

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