如何读取/复制ctype指针到python类?

时间:2009-08-04 19:02:34

标签: python variables pointers ctypes

这是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,因此解析器不知道底层的头字段。

是否有某种方法可以读取该字段以及POINTER()所代表的任何其他字段?

2 个答案:

答案 0 :(得分:1)

方括号表示法确实是正确的。作为参考,这里是我最近制作的一些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 "") + ">"

答案 1 :(得分:0)

好的我工作了

正确的代码是

print packet.data.header[0]
感谢7个敢于查看问题的人

答案的谷歌字符串是:python ctype dereference pointer 第3次点击