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

时间:2017-04-03 08:23:08

标签: python c++ c swig

我有一个像这样的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 个答案:

答案 0 :(得分: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
%}

您更喜欢这样做是基于您首选的编程语言和其他特定情况限制的个人选择。