Проблема с передачей структуры в нативную библиотеку с ctypes

0

У меня есть небольшая проблема с использованием ctypes в первый раз в Python 2.7. Вопрос заключается в следующем:

  1. Я вызываю функцию в собственном коде, чтобы дать мне некоторую память. Функция дает мне указатель на буфер. Перед тем, как продолжить, буфер отбрасывается в структуру ctypes.
  2. Я назначаю некоторые элементы структуры, а также выполняю memmove для заполнения полей, которые мне нужны.
  3. Указатель на буфер передается другой функции в библиотеке.

Проблема в том, что другая функция не видит никаких изменений, которые я сделал в 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;

Заранее благодарю за любую помощь!

Теги:
struct
ctypes

1 ответ

1

Я обнаружил проблему, и это было связано не с тем, как я использовал ctypes. Оказывается, что определение структуры в C отличается от моего связывания с python - CSP_PADDING_BYTES было определено как 8 байтов в собственной библиотеке, тогда как дополнение в связывании с Python равняется 46 байтам.

Определение привязки и структуры не является моим собственным кодом, но, по крайней мере, я знаю, как его исправить!

  • 1
    Итак, это решение или у вас все еще есть проблема? Если нет, вы можете пометить свой ответ как ответ на этот вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню