2024-10-01 09:37:08 发布
网友
我正在尝试将Perl脚本翻译成Python。你知道吗
我翻译这句话有点困难:
my ($sync,$pid,$afccc,@bytes)=unpack('CnCC*',$pkt);
我在Pyhton试过这个
bytes=[] sync,pid,afccc,bytes=struct.unpack_from('BHBB',pkt)
但变量bytes不是该行后面的列表,则执行失败。你知道吗
仅供参考,pkt是一个188个字符长的字符串。你知道吗
有两个问题,在Python3中只解决了一个:
struct.unpack不支持任意重复。(python3.4引入了iter_unpack,但这在这里并没有真正的帮助) 为每个说明符计数。您不能写入'BHB*B';相反,您需要计算BHB之后预期的字节数。幸运的是,这样做并不难:
struct.unpack
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。)
len(pkt)
'BHB*B',不过那也不错。
在Python 2中,必须显式地从数组中提取尾部字节:
fields = packet_fmt.unpack(pkt) sync, pid, afccc = fields[3:] bytes = fields[3:]
或者,您可以使用unpack_from和拼接,因为提取字节时不会太多地解压字节。你知道吗
unpack_from
sync, pid, afccc = header_fmt.unpack_from(pkt) bytes = pkt[header_fmt.size:]
在python3中,您可以使用*name语法来解包元组。你知道吗
*name
sync, pid, afccc, *bytes = packet_fmt.unpack(pkt)
有两个问题,在Python3中只解决了一个:
struct.unpack
不支持任意重复。(python3.4引入了iter_unpack
,但这在这里并没有真正的帮助) 为每个说明符计数。您不能写入'BHB*B'
;相反,您需要计算BHB
之后预期的字节数。幸运的是,这样做并不难:(通常,您可能需要使用
len(pkt)
而不是硬编码188。)'BHB*B'
,不过那也不错。在Python 2中,必须显式地从数组中提取尾部字节:
或者,您可以使用
unpack_from
和拼接,因为提取字节时不会太多地解压字节。你知道吗在python3中,您可以使用
*name
语法来解包元组。你知道吗相关问题 更多 >
编程相关推荐