繁体   English   中英

Python如何通过SWIG从C ++中获取二进制数据(char *)?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM