如何使用 Swig 将 unsigned char* 转换为 Python 列表?

Posted

技术标签:

【中文标题】如何使用 Swig 将 unsigned char* 转换为 Python 列表?【英文标题】:How to convert unsigned char* to Python list using Swig? 【发布时间】:2017-04-03 08:23:08 【问题描述】:

我有一个像这样的 C++ 类方法:

class BinaryData

public:
    ...
    void serialize(unsigned char* buf) const;
;

serialize 函数只获取二进制数据为unsigned char*。 我使用 SWIG 来包装这个类。 我想在 python 中将二进制数据读取为byte arrayint array

Python 代码:

buf = [1] * 1000;
binData.serialize(buf);

但出现无法转换为unsigned char* 的异常。 如何在python中调用这个函数?

【问题讨论】:

【参考方案1】:

最简单的做法是在 Python 中进行转换:

buf = [1] * 1000;
binData.serialize(''.join(buf));

开箱即用,但根据 Python 用户的期望,可能不太优雅。您可以使用 SWIG inside Python code 来解决这个问题,例如与:

%feature("shadow") BinaryData::serialize(unsigned char *) %
def serialize(*args):
    #do something before
    args = (args[0], ''.join(args[1]))
    $action
    #do something after
%

或者在生成的接口代码中,例如使用buffers protocol:

%typemap(in) unsigned char *buf %
    //    use PyObject_CheckBuffer and
    //    PyObject_GetBuffer to work with the underlying buffer
    // AND/OR
    //    use PyIter_Check and
    //    PyObject_GetIter
%

您更喜欢在哪里执行此操作是个人选择,具体取决于您首选的编程语言和其他特定情况的限制。

【讨论】:

以上是关于如何使用 Swig 将 unsigned char* 转换为 Python 列表?的主要内容,如果未能解决你的问题,请参考以下文章

SWIG 将 const unsigned char example[] 包装到 Java byte[] 作为参数

SWIG 将 unsigned char* 转换为 20 字节缓冲区 Java 结构

Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数

TypeError:在方法“...”中,使用 swig 模块时类型为“unsigned char const *”的参数 1

如何使用 swig 从`unsigned int *`返回`uint []`

如何将 unsigned char[] 转换为 std::vector<unsigned char>