У меня есть небольшая проблема с использованием ctypes в первый раз в Python 2.7. Вопрос заключается в следующем:
Проблема в том, что другая функция не видит никаких изменений, которые я сделал в Python. Я подтвердил это с помощью gdb на интерпретаторе Python. В принципе, ни одна из выполненных мной операций не оказала никакого эффекта, и поля, которые я ожидал установить, равны нулю или не содержат данных.
Вот код Python, который взаимодействует с библиотекой:
pxCspPacket = ctypes.cast(
pycsp.csp_buffer_get(bytesToSend),
ctypes.POINTER(pycsp.csp_packet_t))
pxCspPacket.contents.length = bytesToSend
ctypes.memmove(pxCspPacket.contents.data,
dataToSend,
bytesToSend)
# Send packet
pycsp.csp_send(conn, pxCspPacket, self.cspTimeout)
Связи с библиотекой заключаются в следующем:
class csp_packet_t (ctypes.Structure):
_pack_ = 1
_fields_ = [("padding", ctypes.c_uint8 * 46),
("length", ctypes.c_uint16),
("id", csp_id_t),
("data", ctypes.c_uint8 * 256)]
Соответствующее определение структуры в C:
typedef struct __attribute__((__packed__)) {
uint8_t padding[CSP_PADDING_BYTES];
uint16_t length;
csp_id_t id;
union {
uint8_t data[0];
uint16_t data16[0];
uint32_t data32[0];
};
} csp_packet_t;
Заранее благодарю за любую помощь!
Я обнаружил проблему, и это было связано не с тем, как я использовал ctypes. Оказывается, что определение структуры в C отличается от моего связывания с python - CSP_PADDING_BYTES было определено как 8 байтов в собственной библиотеке, тогда как дополнение в связывании с Python равняется 46 байтам.
Определение привязки и структуры не является моим собственным кодом, но, по крайней мере, я знаю, как его исправить!