Domanda

Questo è un tipo di follow-up da la mia ultima domanda se questo può aiutarti .

Sto definendo alcune strutture di tipo

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))]

nota che questo è analizzato correttamente da Python, le classi mancanti sono definite altrove. Il mio problema è quando chiamo il seguente codice

packet = EthercatPacket()
ethercap.RecvPacket(byref(packet))
print packet.data.header

Questo non è corretto. A quanto ho capito il problema, i dati sono una sorta di puntatore, quindi non sono (realmente) mappati su EthercatDatagram, quindi il parser non conosce il campo dell'intestazione sottostante.

c'è un modo per leggere quel campo e qualsiasi altro campo rappresentato da POINTER ()?

È stato utile?

Soluzione 2

Ok ho capito che funziona

il codice corretto era

print packet.data.header[0]

grazie alla persona 7 che ha osato guardare la domanda

la stringa di google per la risposta era: puntatore dereference ptyon ctype 3o colpo

Altri suggerimenti

La notazione tra parentesi quadre è effettivamente corretta. Per riferimento, ecco uno snippet da alcuni codici di tipo che ho fatto di recente:

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 "") + ">"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top