Как читать / копировать указатели ctype в класс Python?

StackOverflow https://stackoverflow.com/questions/1229318

Вопрос

Это своего рода продолжение моего моего последнего вопроса , если это поможет вам .

Я определяю несколько структур 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))]

обратите внимание, что это правильно анализируется Python, отсутствующие классы определены в другом месте. Моя проблема, когда я вызываю следующий код

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

Это неверно. Как я понимаю проблема, данные являются своего рода указателем, поэтому они (на самом деле) не отображаются в EthercatDatagram, следовательно, анализатор не знает основного поля заголовка.

есть ли способ прочитать это поле так же, как любое другое поле, представленное POINTER ()?

Это было полезно?

Решение 2

Хорошо, у меня все получилось

правильный код был

print packet.data.header[0]

спасибо 7 человек, которые осмелились взглянуть на вопрос

строка Google для ответа была: указатель разыменования Python ctype 3-й хит

Другие советы

Квадратная скобка действительно верна. Для справки приведу фрагмент кода ctypes, который я недавно сделал:

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 "") + ">"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top