快点: 我想从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。