Comment lire / copier des pointeurs ctype dans une classe python?
Question
C’est une sorte de suivi de ma dernière question si cela peut vous aider .
Je définis quelques structures de type 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))]
notez que ceci est correctement analysé par python, les classes manquantes sont définies ailleurs. Mon problème est quand j'appelle le code suivant
packet = EthercatPacket()
ethercap.RecvPacket(byref(packet))
print packet.data.header
Ceci est incorrect. Si j'ai bien compris le problème, les données sont une sorte de pointeur et ne sont donc pas (vraiment) mappées sur EthercatDatagram. Par conséquent, l'analyseur ne connaît pas le champ d'en-tête sous-jacent.
Y at-il un moyen de lire ce champ ainsi que tout autre champ représenté par POINTER ()?
La solution 2
Ok je l'ai fait travailler
le code correct était
print packet.data.header[0]
merci à la personne qui a osé regarder la question
la chaîne Google pour la réponse était: pointeur de déréférence python ctype 3ème coup
Autres conseils
La notation entre crochets est en effet correcte. Pour référence, voici un extrait de code de ctypes que j'ai récemment créé:
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 "") + ">"