![](/img/trans.png)
[英]Fill char* with binary data in a c++ Python wrapped class with SWIG
[英]How Python can get binary data(char*) from C++ by SWIG?
我正在使用SWIG的Python中的C ++函数,现在我遇到了一个问题。 当我将char *从C ++传递给Python时,char *被Python中断。
例如:
example.h文件:
char * fun()
{
return "abc\0de";
}
现在在Python中,我们调用example.fun()它只打印“abc”而不是“abc \\ 0de”,Python删除了'\\ 0'后面的数据。
我想从C ++中的fun()得到所有字符(它是一个可以包含'\\ 0'的二进制数据),任何建议都表示赞赏
首先,如果你正在处理二进制数据,你不应该使用char *
(swig认为它们是正常的字符串)。 相反,你应该使用void *
。 swig提供了一个名为'cdata.i'的模块 - 你应该在接口定义文件中包含它。
一旦你包含它,它提供了两个函数 - cdata()
和memmove()
。
void *
和二进制数据的长度, cdata()
将其转换为目标语言的字符串类型。 memmove()
执行相反的操作 - 给定一个字符串类型,它会将字符串的内容(包括嵌入的空字节)复制到C void*
类型中。 使用此模块可以更轻松地处理二进制数据。 我希望这就是你所需要的。
example.i
%module example
%include "cdata.i"
%{
void *fun()
{
return "abc\0de";
}
%}
test.py
import example
print example.cdata(example.fun(), 6)
C / C ++字符串以NULL结尾,这意味着第一个\\0
字符表示字符串的结尾。
当一个函数返回一个指向这样一个字符串的指针时,调用者(在本例中为SWIG)无法知道在第一个\\0
之后是否有更多数据,这就是为什么你只得到第一部分。
所以要做的第一件事就是改变你的C函数,不仅返回字符串,还返回它的长度。 由于只能有一个返回值,我们将使用指针参数。
void fun(char** s, int *sz)
{
*s = "abc\0de";
*sz = 6;
}
SWIG文档建议使用cstring.i
库来包装这些函数。 特别是,最后一个宏完全符合您的需求。
%cstring_output_allocate_size(parm, szparm, release)
阅读文档以了解如何使用它。
请参阅文档中的8.3 C字符串处理 。
还来自文档 :
char *数据类型作为以NULL结尾的ASCII字符串处理。 SWIG将此映射为目标脚本语言中的8位字符串。 SWIG将目标语言中的字符串转换为NULL终止字符串,然后再将它们传递给C / C ++。 这些字符串的默认处理不允许它们具有嵌入的NULL字节。 因此,char *数据类型通常不适合传递二进制数据。 但是,可以通过定义SWIG类型映射来更改此行为。 有关此内容的详细信息,请参阅类型映射一章。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.