c++ - 使用 ctypes 将结构传递给 native 库时遇到问题

标签 c++ python c struct ctypes

我第一次在 Python 2.7 中使用 ctypes 时遇到了一些麻烦。问题如下:

  1. 我在 native 代码中调用一个函数来给我一些内存。该函数为我提供了指向缓冲区的指针。在继续之前,缓冲区被转换为 ctypes 结构。
  2. 我分配了一些结构成员并执行了 memmove 来填充我需要的字段。
  3. 指向缓冲区的指针被传递给库中的另一个函数。

问题是另一个函数没有看到我在 Python 中所做的任何更改。我在 Python 解释器上使用 gdb 确认了这一点。基本上,我执行的所有操作似乎都没有任何效果,我希望设置的字段为零或不包含任何数据。

这是与库交互的 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)

库的绑定(bind)如下:

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中struct对应的定义:

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 绑定(bind)不同——CSP_PADDING_BYTES 在 native 库中被定义为 8 字节,而 Python 绑定(bind)中的填充设置为 46 字节。

绑定(bind)和结构定义不是我自己的代码,但至少我知道如何修复它!

关于c++ - 使用 ctypes 将结构传递给 native 库时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19419580/

相关文章:

python - 如何将 axhline 发送到 Matplotlib 条形图的后面

c - 使用 execv 将一个进程的输出传输到另一进程的程序

c - C中的单链表(插入节点)

使用 C++ 14 中的初始化捕获生成 C++ Lambda 代码

c++ - std::unique_lock<std::mutex> 还是 std::lock_guard<std::mutex>?

c++ - 复杂的语法(类)

Python, Telethon 发送专辑

python - 是否可以在cassandra中创建带有uuid的表?

c++ - 有人知道模仿 Pascal 的 "range array"的类吗?

c - char *s[] 和 char (*s)[] 有什么区别?