python struct unpack

问题描述

我正在尝试转换以下perl代码
unpack(..,\"Z*\")
到python,但是struct.unpack()中缺少\“ * \”格式修饰符似乎使这不可能。有没有办法可以在python中做到这一点? 附言来自perldoc的perl中的\“ * \”修饰符-为重复计数提供*而不是数字,意味着可以使用,但是剩下很多项目,... 因此,尽管python具有像perl这样的数字重复计数,但它似乎缺少*重复计数。     

解决方法

python的
struct.unpack
没有
Z
格式
Z  A null-terminated (ASCIZ) string,will be null padded.
我认为这
unpack(..,\"Z*\")
将会:
data.split(\'\\x00\')
虽然那会去除空值     ,我假设您创建了结构数据类型,并且知道结构的大小。如果是这种情况,则可以创建为该结构分配的缓冲区,然后将值打包到缓冲区中。拆包时,只需指定起点即可使用同一缓冲区直接拆包。 例如
import ctypes
import struct
s = struct.Struct(\'I\')
b = ctypes.create_string_buffer(s.size)
s.pack_into(b,42)
s.unpack_from(b,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)
则完全除以该元素的打包大小。