Wie lesen / kopieren ctype Zeiger in Python-Klasse?
Frage
Dies ist eine Art von Follow-up von wenn dies kann Ihnen helfen, .
Ich bin die Definition ein paar ctype Strukturen
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))]
Beachten Sie, dass diese korrekt von Python analysiert werden, werden die fehlenden Klassen an anderer Stelle definiert. Mein Problem ist, wenn ich den folgenden Code aufrufen
packet = EthercatPacket()
ethercap.RecvPacket(byref(packet))
print packet.data.header
Das ist falsch. Wie ich das Problem zu verstehen, Daten eine Art Zeiger ist, so dass es zu EthercatDatagram nicht (wirklich) zugeordnet ist, daher ist der Parser nicht das zugrunde liegende Header-Feld kennen.
ist es eine Möglichkeit, dieses Feld sowie anderes Feld von POINTER () dargestellt zu lesen?
Lösung 2
Ok, ich habe es funktioniert
richtiger Code war
print packet.data.header[0]
Dank der 7 Person, die auf die Frage zu suchen gewagt
die Google-String für die Antwort war: python ctype dereferenzieren Zeiger 3. Hit
Andere Tipps
Die eckige Klammer-Notation ist in der Tat richtig. Als Referenz ist hier ein Ausschnitt aus einigem ctypes Code, den ich vor kurzem gemacht:
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 "") + ">"