perl解包函数到python

2024-10-01 09:37:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将Perl脚本翻译成Python。你知道吗

我翻译这句话有点困难:

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

我在Pyhton试过这个

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

但变量bytes不是该行后面的列表,则执行失败。你知道吗

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


Tags: from脚本列表pyhtonbytesmysyncpid
1条回答
网友
1楼 · 发布于 2024-10-01 09:37:08

有两个问题,在Python3中只解决了一个:

  1. 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',不过那也不错。

  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:]
    

    在python3中,您可以使用*name语法来解包元组。你知道吗

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

相关问题 更多 >