将 C++ 转换为 Python 通过引用返回无符号 char*

swig c++ to python return unsigned char* by reference

本文关键字:返回 引用 无符号 char C++ 转换 Python      更新时间:2023-10-16

我正在使用swig将c ++函数包装到python中,如下所示:

int getBytes(unsigned char *& result, int length)

我从这个问题中学到了如何通过引用包装返回的 char* 函数:

%typemap(in,numinputs=0) char*& (char* tmp) %{
    $1 = &tmp;
%}
%typemap(argout) char*& (PyObject* obj) %{
    obj = PyUnicode_FromString(*$1);
    $result = SWIG_Python_AppendOutput($result,obj);
%}
%typemap(freearg) char*& %{
    free(*$1);
%}

我尝试将其应用于无符号字符*,但失败了,并收到错误,SWIG_Python_AppendOutput无法将无符号字符**转换为签名字符**。我搜索了python文档,但没有找到可以将无符号字符**转换为无符号字符**的函数。有人可以帮忙吗?谢谢!

很久以前我就解决了这个问题,以下是我的解决方案:

%typemap(in, numinputs= 0) (unsigned char *&result, int &length) (unsigned char *temp, int len) %{
  $1 = &temp;
  $2 = &len;
%}
%typemap(argout) (unsigned char *&result, int &length)  %{
    PyObject* arg5 = 0;
    arg5 = SWIG_FromCharPtrAndSize((const char *)(*$1), *$2);
    PyObject* temp = NULL;
    temp = $result;
    $result = PyList_New(1);
    PyList_SetItem($result, 0, temp);
    PyList_Append($result, (PyObject*)arg5);//unsigned char *&
    PyList_Append($result, PyInt_FromLong(*$2));
    Py_DECREF(temp);
%}