当前位置: 首页 > 面试题库 >

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

胡曾笑
2023-03-14
问题内容

我在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’的二进制数据),我们不胜感激


问题答案:

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)

阅读文档以了解如何使用它。



 类似资料:
  • 有什么方法可以将HTML画布的内容作为二进制数据读取吗? 目前,我有以下HTML来显示输入文件及其下面的画布: 任何帮助都会很好!干杯

  • 问题内容: 我的页面上有一个通过URL调用spring控制器的页面。 现在,控制器看起来像 我发送的数据使用模式,并试图访问它的,但它显示为空白。 有什么方法可以在查看页面上接收该数据? 问题答案: 您必须为Spring Ajax调用示例添加@ResponseBody批注

  • 问题内容: 我试图用来获取Chrome标签,如下所示: (伪代码) 按F6定向网址行。 Ctrl + C复制网址 从剪贴簿获取网址 通过BS4处理URL,请求,selenium等。 我完成了步骤1并停留在步骤2。同样,我也不知道如何处理步骤3。因此,认为我发现的方法不正确且效率不高。有人可以建议我应该做什么或给我更好的方法吗? 问题答案: 只是将所有评论汇总在一个答案中… 没有技巧和剪贴板抓取功能

  • 我想通过“id”从我的mongodb获取数据。如果我的id与mongodb中id的值匹配,则它将获取该对象,但其抛出错误为: {“message”:“对于模型“PostMessage”“”的路径“\u id”处的值“s-CoAhDKd”,转换为ObjectId失败}

  • 我是反应和烧瓶API系统的新手。我创建了一个网站,允许用户通过搜索栏进行搜索。我希望能够通过POST请求将查询从React搜索栏发送到FlaskAPI。但是,我得到一个空字符串或ImmutableDict 反应码 烧瓶代码 回答如下:获取烧瓶请求中收到的数据 我尝试了所有这些方法,但是我总是(在烧瓶中)得到一个空字符串,除非我使用返回给我类似的东西: 然而,在webconsole中,我得到: 我假

  • 问题内容: 我正在尝试2天,以找到一种从数据库中检索一些图像的方法。它们被保存为二进制字符串(我在某个地方读过该术语,但坦率地说从未听说过)。 大多数图像都是格式化的,很容易获取并保存到文件中。但是我的问题是图像。由于某种原因,我当时无法显示。 现在,我正在使用一个简单的代码来获取图像并将其保存到文件中: 在和中都能正常工作,但是在尝试显示时格式不可读。 我已经发现但尚未解决的问题: http:/