Pergunta

Este é um tipo de follow-up de minha última pergunta se isso pode ajudá-lo .

Eu estou definindo algumas estruturas 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))]

Note que esta é analisado corretamente por python, as classes ausentes são definidos em outro lugar. Meu problema é quando eu chamo o seguinte código

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

Isso é incorreto. Como eu entendo o problema, os dados são algum tipo de ponteiro para que ele não é (realmente) mapeado para EthercatDatagram, portanto, o analisador não sabe o campo de cabeçalho subjacente.

Existe alguma maneira de ler nesse campo, bem como qualquer outro campo representado pelo ponteiro ()?

Foi útil?

Solução 2

Ok, eu tenho que trabalhar

código correto era

print packet.data.header[0]

graças ao 7 pessoa que se atreveu a olhar para a questão

a corda google a resposta foi: python ponteiro ctype dereference 3º hit

Outras dicas

A notação de colchetes é realmente correta. Para referência, aqui está um trecho de algum código ctypes Eu fiz recentemente:

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 "") + ">"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top