使用ctypes将结构传递到本机库时出现问题

2024-05-29 03:04:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python2.7中第一次使用ctypes有点麻烦。问题如下:

  1. 我在本机代码中调用一个函数来给我一些内存。这个函数给我一个指向缓冲区的指针。继续之前,将缓冲区强制转换为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)

对库的绑定如下:

^{pr2}$

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;

提前感谢您的帮助!在


Tags: 函数代码packetcontentsctypes结构lengthcsp
1条回答
网友
1楼 · 发布于 2024-05-29 03:04:28

我发现了这个问题,这与我使用ctypes的方式无关。结果发现,C语言中结构的定义与我的python绑定不同——在本机库中,CSP_PADDING_BYTES被定义为8字节,而python绑定中的填充被设置为46字节。在

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

相关问题 更多 >

    热门问题