如何将ctype指针读入/复制到python类中?

2 投票
2 回答
941 浏览
提问于 2025-04-15 13:22

这是我之前提问的一个后续内容,可能对你有帮助。

我正在定义一些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

这就不对了。根据我的理解,data是一种指针,所以它并没有真正映射到EthercatDatagram上,因此,解析器不知道底层的header字段。

有没有办法读取那个字段,以及任何其他由POINTER()表示的字段呢?

2 个回答

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 "") + ">"
0

好的,我搞定了

正确的代码是

print packet.data.header[0]

感谢那7位敢于查看这个问题的人

我在谷歌上找到答案的关键词是:python ctype 解引用指针,第三个结果

撰写回答