0

ネットワークからの入力パケットをPythonで解析しようとしています。

そのために、単純なクラスを作成しました:

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

フィールド「チャレンジ」は、null で終わる文字列であり、可変 (変更可能) サイズです。そこで、S2C_ChallengePacket クラスにpack変数を追加しました。

Python のドキュメント:

packインスタンス内の構造体フィールドの配置をオーバーライドできるオプションの小さな整数。packは、フィールドが割り当てられるときに既に定義されている必要があります。そうでない場合、効果はありません。

しかし、「チャレンジ」フィールドを参照しようとすると、「セグメンテーション違反」エラーが発生します。

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

1 に答える 1

1

Ac_wchar_pはポインターであるため、機能しません。これは、struct モジュールを使用すると簡単になります。

>>> 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')
于 2013-07-08T22:03:22.513 に答える