python struct 解包

1 投票
3 回答
1829 浏览
提问于 2025-04-16 16:46

我正在尝试把以下的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')

不过这样会去掉空值

撰写回答