这是 my last question 的一种跟进如果这对您有帮助。
我正在定义一些 ctype 结构
class EthercatDatagram(Structure):
_fields_ = [("header", EthercatDatagramHeader),
("packet_data_length", c_int),
("packet_data", POINTER(c_ubyte)),
("work_count", c_ushort)]
class EthercatPacket(Structure):
_fields_ = [("ether_header", ETH_HEADER),
("Ethercat_header", EthercatHeader),
("data", POINTER(EthercatDatagram))]
请注意,这是由 python 正确解析的,缺少的类在别处定义。 我的问题是当我调用以下代码时
packet = EthercatPacket()
ethercap.RecvPacket(byref(packet))
print packet.data.header
这是不正确的。据我了解这个问题,数据是某种指针,因此它没有(真的)映射到 EthercatDatagram,因此,解析器不知道底层的 header 字段。
有没有办法读取该字段以及 POINTER() 表示的任何其他字段?
请您参考如下方法:
方括号符号确实是正确的。作为引用,这是我最近制作的一些 ctypes 代码的片段:
class Message(Structure):
_fields_ = [ ("id", BYTE), ("data", POINTER(BYTE)), ("data_length", DWORD) ]
def __repr__(self):
d = ' '.join(["0x%02X" % self.data[i] for i in range(self.data_length)])
return "<Message: id = 0x%02X, " % (self.id) + "data_length = " + str(self.data_length) + (self.data_length > 0 and (", data: " + d) or "") + ">"
