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的主要内容,如果未能解决你的问题,请参考以下文章