python struct unpack

时间:2011-05-01 15:04:51

标签: python perl struct unpack

我正在尝试转换以下perl代码:

unpack(.., "Z*")

到python,但是struct.unpack()中缺少“*”格式修饰符似乎使这个变得不可能。有没有办法在python中做到这一点?

P.S。来自perldoc的perl中的“*”修饰符 - 为重复计数提供a *而不是数字意味着使用了许多项目,...

因此虽然python的数字重复次数与perl相似,但似乎缺少*重复次数。

3 个答案:

答案 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)完全除以该元素的打包大小。