我正在尝试用python解析来自网络的输入数据包。
为此,我创建了简单的类:
class S2C_ChallengePacket(ctypes.Structure):
_pack_ = 1
_fields_ = [
("type", ctypes.c_byte),
("sessionid", ctypes.c_byte * 4),
("challenge", ctypes.c_wchar_p)]
字段“挑战”它是以空字符结尾的字符串,并且它具有可变(可更改)的大小。所以我将 pack 变量添加到我的S2C_ChallengePacket类中。
pack 一个可选的小整数,允许覆盖实例中结构字段的对齐方式。 pack 必须在分配字段时定义,否则无效。
但是,如果我尝试参考“挑战”字段,我会收到“分段错误”错误。
packet = QueryPacket.S2C_ChallengePacket.from_buffer_copy(data)
print packet.challenge <--- "Segmentation fault" here
答案 0 :(得分:1)
c_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')