2011-05-01 107 views
1

我嘗試轉換下面的Perl代碼:蟒蛇結構解壓

unpack(.., "Z*") 

到Python,但缺乏struct.unpack一個「*」格式修飾符()似乎使這個不可能的。有沒有辦法我可以在Python中做到這一點?

P.S. perldoc中perl中的「*」修飾符 - 爲重複計數提供a *而不是數字意味着使用,但是剩下很多項目...

因此,儘管python有一個像perl這樣的數字重複計數,似乎缺少重複計數。

回答

3

python的struct.unpack沒有Z格式

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

我認爲這

unpack(.., "Z*") 

是:

data.split('\x00') 

儘管這條中的空白

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)是完全由元素的填充大小劃分。

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) 
+0

不幸的是,結構數據類型不是由我創建的,但我已經能夠對其某些字段進行反向工程。 – Schitti 2011-05-03 00:07:28