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 类中添加了包变量。

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 回答