我嘗試轉換下面的Perl代碼:蟒蛇結構解壓
unpack(.., "Z*")
到Python,但缺乏struct.unpack一個「*」格式修飾符()似乎使這個不可能的。有沒有辦法我可以在Python中做到這一點?
P.S. perldoc中perl中的「*」修飾符 - 爲重複計數提供a *而不是數字意味着使用,但是剩下很多項目...
因此,儘管python有一個像perl這樣的數字重複計數,似乎缺少重複計數。
我嘗試轉換下面的Perl代碼:蟒蛇結構解壓
unpack(.., "Z*")
到Python,但缺乏struct.unpack一個「*」格式修飾符()似乎使這個不可能的。有沒有辦法我可以在Python中做到這一點?
P.S. perldoc中perl中的「*」修飾符 - 爲重複計數提供a *而不是數字意味着使用,但是剩下很多項目...
因此,儘管python有一個像perl這樣的數字重複計數,似乎缺少重複計數。
python的struct.unpack
沒有Z
格式
Z A null-terminated (ASCIZ) string, will be null padded.
我認爲這
unpack(.., "Z*")
是:
data.split('\x00')
儘管這條中的空白
您必須計算重複自己算:
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)
是完全由元素的填充大小劃分。
我假設你創建了結構數據類型,並知道結構的大小。如果是這種情況,那麼你可以創建一個爲該結構分配的緩衝區,並將值打包到緩衝區中。在解包時,您可以使用相同的緩衝區直接指定起點來解包。
例如,
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)
不幸的是,結構數據類型不是由我創建的,但我已經能夠對其某些字段進行反向工程。 – Schitti 2011-05-03 00:07:28