python struct 解包
我正在尝试把以下的perl代码:
unpack(.., "Z*")
转换成python,不过在struct.unpack()中没有“*”这种格式修饰符,这似乎让这个转换变得不可能。我可以在python中做到这一点吗?
附注:在perl文档中,“*”修饰符的意思是用剩下的所有项来代替数字作为重复计数,...
所以虽然python有像perl那样的数字重复计数,但似乎没有“*”这种重复计数。
3 个回答
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)
可以被这个元素的大小整除。
2
我假设你已经创建了一个结构体数据类型,并且知道这个结构体的大小。如果是这样的话,你可以为这个结构体分配一个缓冲区,然后把值放进这个缓冲区。在取出值的时候,你可以直接使用同一个缓冲区,只需要指定开始的位置就可以了。
比如说:
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)
3
Python中的 struct.unpack
方法没有 Z
这种格式
Z A null-terminated (ASCIZ) string, will be null padded.
我觉得这个
unpack(.., "Z*")
应该是:
data.split('\x00')
不过这样会去掉空值