我正在尝试转换以下perl代码:
unpack(.., "Z*")
到python,但是struct.unpack()中缺少“*”格式修饰符似乎使这个变得不可能。有没有办法在python中做到这一点?
P.S。来自perldoc的perl中的“*”修饰符 - 为重复计数提供a *而不是数字意味着使用了许多项目,...
因此虽然python的数字重复次数与perl相似,但似乎缺少*重复次数。
答案 0 :(得分:3)
python的struct.unpack
没有Z
格式
Z A null-terminated (ASCIZ) string, will be null padded.
我想这个
unpack(.., "Z*")
将是:
data.split('\x00')
虽然剥去了空值
答案 1 :(得分:2)
我假设您创建了struct数据类型,并且您知道结构的大小。如果是这种情况,那么您可以创建为该结构分配的缓冲区,并将值打包到缓冲区中。在解压缩时,您可以使用相同的缓冲区直接解压缩,只需指定起点即可。
例如
import ctypes
import struct
s = struct.Struct('I')
b = ctypes.create_string_buffer(s.size)
s.pack_into(b, 0, 42)
s.unpack_from(b, 0)
答案 2 :(得分:0)
您必须自己计算重复次数:
n = len(s) / struct.calcsize(your_fmt_string)
f = '%d%s' % (n, your_fmt_string)
data = struct.unpack(s, f)
我假设your_fmt_string
没有解包多个元素,len(s)
完全除以该元素的打包大小。