Skip to main content
 首页 » 编程设计

python之如何将 ctype 指针读取/复制到 python 类中

2025年05月04日9xxx_UU

这是 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 "") + ">"