perl将函数解包到python
我正在尝试将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不支持任
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”
,不过还是不错的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)