【问题标题】:Convert char* buffers to byte arrays when using SWIG and C#使用 SWIG 和 C# 时将 char* 缓冲区转换为字节数组
【发布时间】:2019-10-07 00:42:04
【问题描述】:

我维护了一个 C++ SDK,现在需要将其转换为其他语言(特别是 C# 和 Java)。我正在使用 SWIG 生成我的包装器代码并成功完成了 Java 工作。我现在需要让 C# 工作。

我有一个 C++ 函数(忽略函数签名中的 Header 对象 - 我已经解决了)

int send(Header header, char *payload);

此外,我在 C++ 中有一个 director 类,如下所示:

class Callbacks {
public:
    virtual ~Callbacks() { }
    virtual void receive(Header header, char *payload) { }
};

这允许我在我的 Java 和 C# 代码中创建回调。

我需要 C# 中 sendreceive 的以下函数签名:

int send(Header header, byte[] payload);

void receive(Header header, byte[] payload);

SWIG 中的类型映射似乎是要走的路,所以这是我为 C# 进行类型映射的尝试:

%module(directors="1") example

%{
#include "example.h"
%}

%feature("director") Callbacks;

%include "arrays_csharp.i"
CSHARP_ARRAYS(char, byte)
%typemap(imtype, inattributes="[In, MarshalAs(UnmanagedType.LPArray, SizeConst=2048, ArraySubType=UnmanagedType.U1)]") char INPUT[] "byte[]"

%apply char INPUT[] {char *payload}

%include "example/include/example.h"

该接口文件的结果获得了我想要的函数签名,但我的字节数组的大小仅为 1,并且我只获得了原始字符缓冲区中的第一项。似乎 SWIG 将 char* 解释为指向 char 的指针,因此将我的 char* 缓冲区中的第一个元素插入到字节数组中并称之为好。但我想创建一个大小为 2048 的字节数组(没有有效负载的大小会大于该大小)并从 char* 缓冲区填充该字节数组。如果有什么不同的话,我的 Header 类对象的大小与 char* 缓冲区一样大,但我现在真的不太关心这个,而是坚持使用 2048 字节的总大小。

我们将不胜感激您的想法或帮助!

@Flexo 我在 StackOverflow 上看到了你的其他 SWIG 帖子,你似乎是我的人帮助我。祈祷你看到这个!

【问题讨论】:

    标签: c# arrays char buffer swig


    【解决方案1】:

    我也遇到了同样的问题,刚刚解决了。

    C++如下

    // Access.h

    class Access
    {
        void foo(unsigned char *inputBytes, int nbytes);
    };
    

    Swig .i 文件如下。 %apply 出现在要包装的代码的 %include 之前 似乎很重要。如果是之后,则没有任何变化。

    %include "arrays_csharp.i"
    %apply unsigned char INPUT[]  {unsigned char *inputBytes}  
    %include "Access.h"
    

    C# 就是这样的

    byte[] data = ...
    var access = new Access();
    access.foo(fileBytes, fileBytes.Length);
    

    使用 swig 3.0.2 我根本无法让它工作。使用 swig 3.0.12 我成功了。

    我还不需要输出数组,但这种方法至少可以在 C# 中使用预先分配的缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-03
      • 2016-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 2013-08-11
      相关资源
      最近更新 更多