如何在类[python]中更改ctypes字段大小?

时间:2013-07-08 15:49:32

标签: python struct ctypes

我正在尝试用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类中。

Python's documentation

  

pack 一个可选的小整数,允许覆盖实例中结构字段的对齐方式。 pack 必须在分配字段时定义,否则无效。

但是,如果我尝试参考“挑战”字段,我会收到“分段错误”错误。

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

1 个答案:

答案 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')