python结构解包

python结构解包,python,perl,struct,unpack,Python,Perl,Struct,Unpack,我正在尝试转换以下perl代码: unpack(.., "Z*") 然而,对于python来说,struct.unpack()中缺少“*”格式修饰符似乎使这变得不可能。有没有一种方法可以在python中实现这一点 另外,perl中perldoc中的“*”修饰符-为重复计数提供一个*而不是一个数字意味着使用剩余的多少项 因此,尽管python有一个类似perl的数字重复计数,但它似乎缺少*重复计数。您必须自己计算重复计数: n = len(s) / struct.calcsize(your_fm

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

unpack(.., "Z*")
然而,对于python来说,struct.unpack()中缺少“*”格式修饰符似乎使这变得不可能。有没有一种方法可以在python中实现这一点

另外,perl中perldoc中的“*”修饰符-为重复计数提供一个*而不是一个数字意味着使用剩余的多少项


因此,尽管python有一个类似perl的数字重复计数,但它似乎缺少*重复计数。

您必须自己计算重复计数:

n = len(s) / struct.calcsize(your_fmt_string)
f = '%d%s' % (n, your_fmt_string)
data = struct.unpack(s, f)

我假设
您的\u fmt\u字符串
没有解包多个元素,并且
len
完全除以该元素的打包大小。

您必须自己计算重复计数:

n = len(s) / struct.calcsize(your_fmt_string)
f = '%d%s' % (n, your_fmt_string)
data = struct.unpack(s, f)

我假设
您的\u fmt\u字符串
没有解包多个元素,
len(s)
被该元素的压缩大小完美分割。

python的
struct.unpack
没有
Z
格式

Z  A null-terminated (ASCIZ) string, will be null padded.
我觉得这个

unpack(.., "Z*")
将是:

data.split('\x00')

尽管这去除了空值

python的
struct.unpack
没有
Z
格式

Z  A null-terminated (ASCIZ) string, will be null padded.
我觉得这个

unpack(.., "Z*")
将是:

data.split('\x00')

尽管这会去除空值,但我假设您创建了struct数据类型,并且您知道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)

我假设您创建了struct数据类型,并且您知道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)

不幸的是,struct数据类型不是由我创建的,但我能够对其某些字段进行反向工程。不幸的是,struct数据类型不是由我创建的,但我能够对其某些字段进行反向工程。