SWIG,C,Python - 在将char *传递给python

时间:2018-05-22 16:13:32

标签: python c arrays char swig

快点: 我想从C模块(使用SWIG构建)向python回调函数发送一个完整的char *。

我已经可以完成大部分工作但是:我的char数组只是二进制数据,因此包含0,这在C-> Python转换中被视为NULL终止符。 Python只接收字节,直到第一个0而不是完整数组。

在swig文档中,它明确指出将char *作为二进制数据处理是可能的类型映射,但没有说明如何。我一直在玩cstring.i(%cstring_output_withsize等),但我对SWIG相对较新,而且我不够深入。

如何告诉SWIG忽略NULL终止符并在传递给python时使用大小值?

=============================================== ==========

如果您需要更多细节:

对于一些背景知识,我正在为802.15.4 RF网络编写一个非常简单的网络数据包格式/传输协议。网络上有多种体系结构,语言和收发器,因此我正在编写我的库以获得统一的可设置回调函数,允许在每个平台上写入一个小包装器,使用该宿主语言将一个字节缓冲区传递给收件人。 / p>

以下是代码的关键部分。

//defined in Packets.h
void (*send_callback_ptr)(char * payload, uint8_t payload_length, uint16_t destination,  uint16_t sequence_no);

//a function to set the callback
void send_callback_set(void (*f)(char * payload_buffer, uint8_t payload_length, uint16_t destination,  uint16_t sequence_no))
{
    send_callback_ptr = f;
}


uint8_t send(uint16_t target, enum PACKET_TYPE type, void * packet_object) {
    char * payload_buffer = malloc(128); //max buffer size is 128
    uint8_t payload_length = 12;

    pack(target, type, packet_object, payload_buffer);

    uint16_t destination = target;
    uint16_t sequence_no = GLOBAL.hash++;

    send_callback_ptr(payload, payload_length, destination, sequence_no);
};

顶部是回调和回调设置功能。 'send'接受一个目标,一个数据包类型和一个数据包对象(void *所以python可以传递一个指向PyObject的指针)。然后使用'pack()'将所有数据打包到char * payload_buffer中(pack只使用一组规则将数据包对象打包成一个准备发送的字节数组)。

def py_callback(buffer, buffer_length, destination, seq_no):
    print buffer_length
    print "type:", type(buffer)
    print "length:", len(buffer)

    for i in range(len(buffer)):
        print i, '{:02X}'.format(ord(buffer[i]))

MyModule.send_callback_set(py_callback)

然后python看起来像这样从C函数send()结束时调用send_callback_ptr来接收有效载荷,payload_length等。

在一个例子中,python回调函数在得到13时只接收3个字节,因为数组中的第4个字节是0。

0 个答案:

没有答案