ネットワークからの入力パケットを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変数を追加しました。
packインスタンス内の構造体フィールドの配置をオーバーライドできるオプションの小さな整数。packは、フィールドが割り当てられるときに既に定義されている必要があります。そうでない場合、効果はありません。
しかし、「チャレンジ」フィールドを参照しようとすると、「セグメンテーション違反」エラーが発生します。
packet = QueryPacket.S2C_ChallengePacket.from_buffer_copy(data)
print packet.challenge <--- "Segmentation fault" here