1

私は次のperlコードを変換しようとしています:

unpack(.., "Z*")

ただし、Pythonでは、struct.unpack()に「*」形式の修飾子がないため、これが不可能になっているようです。Pythonでこれを行う方法はありますか?

PS perldocからのperlの「*」修飾子-数の代わりに繰り返し回数に*を指定すると、使用することを意味しますが、多くの項目が残っています...

したがって、Pythonにはperlのような数値の繰り返し回数がありますが、*繰り返し回数が不足しているようです。

4

3 に答える 3

3

Pythonの形式struct.unpackはありませんZ

Z  A null-terminated (ASCIZ) string, will be null padded.

私はこれだと思います

unpack(.., "Z*")

だろう:

data.split('\x00')

それはヌルを取り除きますが

于 2011-05-01T15:16:02.540 に答える
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)
于 2011-05-01T15:42:52.243 に答える
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)、その要素のパックされたサイズで完全に分割されていると想定しています。

于 2011-05-01T15:13:11.030 に答える