python结构解包
我正在尝试转换以下perl代码: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
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数据类型不是由我创建的,但我能够对其某些字段进行反向工程。