¿Cómo leer / copiar punteros ctype en la clase python?
Pregunta
Este es un tipo de seguimiento de mi última pregunta si esto puede ayudarlo .
Estoy definiendo algunas estructuras 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))]
tenga en cuenta que Python analiza esto correctamente, las clases que faltan se definen en otra parte. Mi problema es cuando llamo al siguiente código
packet = EthercatPacket()
ethercap.RecvPacket(byref(packet))
print packet.data.header
Esto es incorrecto. Según tengo entendido el problema, los datos son algún tipo de puntero, por lo que no están (realmente) asignados a EthercatDatagram, por lo tanto, el analizador no conoce el campo de encabezado subyacente.
¿hay alguna forma de leer ese campo, así como cualquier otro campo representado por POINTER ()?
Solución 2
Ok, lo tengo funcionando
el código correcto era
print packet.data.header[0]
gracias a la 7 persona que se atrevió a mirar la pregunta
la cadena de google para la respuesta fue: puntero de referencia de tipo python ctype 3er golpe
Otros consejos
La notación de corchetes es correcta. Como referencia, aquí hay un fragmento de un código ctypes que hice recientemente:
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 "") + ">"