为 C++(指针)创建 swig 包装器到 python

2023-12-13

我对 swig 非常陌生,我正在尝试创建一个 swig 包装器,以便在 python 中使用一些 C++ 文件。我有以下 C++ 课程。

以下是我尝试转换的代码片段:

/*packet_buffer.h*/
class CPacketBuffer {
 public:
    // construct based on given buffer, data is not copied
    CPacketBuffer(uint8_t* data, uint32_t length) {
        mpBuffer = data;
        mLength  = length;
        mHead    = 0;
        mTail    = length;
    }
    uint8_t* GetBuffer() {
        return (mpBuffer + mHead);
    }
    void Add(const uint8_t* data, uint32_t length) {
            if ((mTail + length) > mLength) {
            length = (mLength - mTail);
        }
//....
}

我今天一整天都在尝试使用 swig 文档的帮助编写一个 example.i 文件,该文件将接受指向 typedefs(uint8_t *) 的指针,但我没有成功。

以下是我尝试过的 packet_buffer.i 文件,但不起作用。

%module packet_buffer
%include typemaps.i
%apply unsigned char* {uint8_t*};
%apply unit8_t *INPUT {uint8_t *data};



%{
    #define SWIG_FILE_WITH_INIT
    #include "../include/packet_buffer.h"
%}
%include "../include/packet_buffer.h"
  1. 如何为采用 typedef 指针的成员函数编写 swig 代码?
  2. 我可以编写一个可在整个代码中使用的通用 %apply 还是必须为每个 INPUT、OUTPUT 参数编写具体信息?

如果我正确理解了这一点,那么您面临的问题不是它们是指针,而是它们可能是无界数组。

You can 扭曲无界 C 数组使用 carrays.i 和“%array_class”宏,例如:

%module packet
%include "stdint.i"

%{
    #include "packet.h"
%}

%include "carrays.i"
%array_class(uint8_t, buffer);

%include "packet.h"

然后允许你在 Python 中编写如下内容:

a = packet.buffer(10000000) 
p = packet.CPacketBuffer(a.cast(), 10000000)

请注意,您需要确保缓冲区的寿命足够 - 如果 Python 对象在 C++ 代码不知道的情况下被释放,您将最终得到未定义的行为。

你可以转换uint8_t*使用以下命令在 Python 中指向缓冲区实例的指针(无界数组)frompointer的方法%array_class宏还创建,例如:

r = packet.GetBuffer()
buf = packet.buffer_frompointer(r)

You can 添加额外的 Python 代码如果需要,可以自动/隐藏缓冲区之间的大部分转换,或者使用内存视图在 C API 端与 Python 更紧密地集成。

一般来说,因为这是 C++ 我建议使用std::vector为此,在 Python 端使用它比无界数组要好得多,而且它为您提供的安全性和简单性的成本是最低的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 C++(指针)创建 swig 包装器到 python 的相关文章

随机推荐

  • Java:使用 >、< 和 == 比较对象

    是否可以使用运算符正确比较对象 gt lt and 在Java中 我已经实施了Comparable我的一个对象中的接口 这样可以节省一些时间 而且写起来也很好 if obj1 lt obj2 do sth 代替 if obj1 compar
  • 张量流中二维数组最小值到最大值的排序

    我有一个数组 x1 tf Variable 0 51 0 52 0 53 0 94 0 35 0 32 0 72 0 83 0 74 0 55 0 23 0 72 0 63 0 64 0 35 0 11 0 02 0 03 0 14 0 1
  • 增加 OS X Lion 中的堆栈大小

    我需要为需要大量堆栈的 C 程序执行此操作 我使用 g 包含在 OS X Lion 中 来编译它 我怎样才能为我的程序增加它 From http developer apple com library mac qa qa1419 index
  • 从java中的字符串中解析负前缀整数

    您好 我有一个类似于 10 1 30 2 的字符串 我想读取空格之间的数字 我可以使用 FOR 语句和代码来做到这一点 Character toString myString charAt i and Integer parseInt my
  • R markdown asis 破坏了有效的 html 代码

    我有一个输出可以正确渲染的 html 代码的函数 但是将其封装在带有 results asis 的 markdown 文档 R 代码块中失败 我将问题追溯到 HTML 代码中的空格 我喜欢这些空格 因为它们使阅读原始 HTML 文件变得更容
  • 将子节点追加到父节点中

    我需要将子节点附加到父节点中 order h下的order no等于order d的下一个兄弟节点 应该合并到父节点order h 这是 XML
  • 如何将 H2 控制台连接到嵌入式 Spring H2 DB

    好的 我正在开发一个简单的应用程序 其中有 Spring Embedded H2 数据库用于开发 database xml bean 配置如下所示
  • 如何仅显示手机联系人(不包括SIM卡联系人)

    我正在构建一个用户界面 需要在列表视图中显示电话联系人列表 我在用着ContactsContract Data和CursorLoader加载数据 然后将光标绑定到自定义适配器 扩展自SimpleCursorAdapter 这里的问题是我不知
  • 将字符串转换为特定格式的日期

    如何在 SQL Server 2008 R2 中将字符串转换为日期类型 我的字符串已格式化dd mm yyyy 我试过这个 SELECT CAST 01 08 2014 AS DATE 但这确实是演员阵容mm dd yyyy format
  • Android 中 getLastKnownLocation 返回 null

    我知道这个问题已经被讨论过很多次了 但是没有任何东西可以帮助我解决 getLastKnownLocation 返回 null 的问题 我的活动实现 LocationListener public class MainActivity ext
  • 使用 protoc-gen-go 创建一个导入 google/golang 但找不到包的 .pb.go

    我在用着原型 gen go编译C Protocol Buffers into Golang效果很好 我几乎可以go install包 但我收到此错误 cannot find package google protobuf 但我在任何地方都找
  • Azure Web 聊天测试显示“向您的机器人发送此消息时出错:HTTP 状态代码未经授权”

    我将我的微软机器人部署到了 azure 部署后 我通过 在网络聊天中测试 检查我的机器人响应 但它显示消息无法发送 所以我进入频道并查看我的网络聊天 然后显示 向您的机器人发送此消息时出错 HTTP 状态代码未经授权 我错过了什么地方 我没
  • 如何获取某个日期的日期列表? [复制]

    这个问题在这里已经有答案了 我有两个变量 startDate 例如 2018 年 4 月 29 日 howManyDays 例如 30 我想要获取自 2018 年 4 月 29 日起 30 天的列表 你能告诉我该怎么做吗 我发现两个日期之间
  • AJAX 请求后刷新 PHP SESSION var

    I ve index php and callSession04 php When index phpAJAX 请求 PHP SESSION 变量是否设置为callSession04 php存储当前页和每页的行数 但index phpPHP
  • 如何使用 datepicker android 设置最小-最大年龄限制

    在我的应用程序中我需要设置年龄限制之间7 18岁 我想显示选项范围有限的日期选择器 如何使用此代码将同一任务编辑到日期选择器中日期选择器 我使用下面的代码来限制年份 但是当单击 按钮时 年份可以更改为高于 低于限制范围 我希望用户不应该能够
  • 按顺序用数值替换因子变量

    我有这个数据集 col 1 as factor c a a b c b a col 2 c 15 346 3564 99 10 2 col 3 as factor c bb a g f bb a index 1 6 sample data
  • 在 WSL MySQL 上连接 MySQL Workbench?

    我已经在 WSL2 上安装了 MySQL 如下所示 sudo apt remove purge mysql sudo rm rf var lib mysql sudo apt install y mysql server mysql cli
  • 使用 fork 显示循环中的进程数

    如何显示创建的进程数 不使用公式 for i 0 i lt 3 i fork count count 1 printf d count 有多种方法可以做到这一点 一个好的技术是让每个子进程将一个字节写入原始进程可以读取的文件描述符中 请注意
  • iPhone Web 应用程序缓存持久性

    如何编写一个 ASP NET C 应用程序 该应用程序将呈现一个页面 当该页面被添加为 主屏幕图标 时 可以永久缓存在 iPhone 上 我尝试在 Response ExpiresAbsolute DateTime MaxValue 后面的
  • 为 C++(指针)创建 swig 包装器到 python

    我对 swig 非常陌生 我正在尝试创建一个 swig 包装器 以便在 python 中使用一些 C 文件 我有以下 C 课程 以下是我尝试转换的代码片段 packet buffer h class CPacketBuffer public