如何使用 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 array
或int 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