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?

War es hilfreich?

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 "") + ">"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top