2013-07-08 53 views
0

我想解析來自網絡與python的輸入數據包。如何更改類[python]中的ctypes字段大小?

爲了做到這一點,我創建簡單的類:

class S2C_ChallengePacket(ctypes.Structure): 
    _pack_ = 1 
    _fields_ = [ 
    ("type", ctypes.c_byte), 
    ("sessionid", ctypes.c_byte * 4), 
    ("challenge", ctypes.c_wchar_p)] 

現場「挑戰」這是空值終止字符串,它有一個變量(可更換)尺寸。所以我加了變量給我的S2C_ChallengePacket類。

Python's documentation

可選的小的整數,其允許覆蓋在該實例結構域的比對。 必須已定義字段已分配,否則它將不起作用。

但是,如果我嘗試引用「挑戰」字段,我會收到「分段錯誤」錯誤。

packet = QueryPacket.S2C_ChallengePacket.from_buffer_copy(data) 
print packet.challenge <--- "Segmentation fault" here 
+0

你確定包是做你認爲它在做什麼?你能舉一個你的數據的例子嗎? – GWW

+0

這裏的例子http://wiki.vg/Query#Response – TroyashkA

回答

1

A c_wchar_p是一個指針,所以不起作用。這將使用結構模塊更容易:

>>> base_size = struct.calcsize('>BI') 
>>> response = b'\x09\x00\x00\x00\x019513307\x00' 
>>> response = response[:-1] # remove null 
>>> token_len = len(response) - base_size 
>>> struct.unpack('>BI%ds' % token_len, response) 
(9, 1, b'9513307') 
相關問題