SWIG Python和C ++ std :: string null-termination问题

时间:2011-02-24 18:21:11

标签: c++ python string swig

  

可能重复:
  How Python can get binary data(char*) from C++ by SWIG?

我有一个基于SWIG的C ++接口,可以从Python调用。其中有一个函数,它有一个std :: string参数。它看起来像这样:

WrapperGet(const std::string& key);

如果从Python调用包含NUL字符的字符串参数(例如二进制数据),则在NUL字符处截断std :: string,这是我的问题,因为它无法处理二进制数据

令人感兴趣的是其他方式完美无缺:

std::string WrapperResult();

此处返回的字符串可以包含二进制数据而不会截断。有谁知道要做什么?

更新:我调试了SWIG生成的代码,结果发现错误在C ++大小的包装代码中:它使用std :: string的c_str()成员函数来获取字符串值。

感谢大家的想法和时间!

2 个答案:

答案 0 :(得分:3)

我过去必须处理这个问题,我刚从SWIG抓取了std::string转换模板,并在从{{创建Python字符串'时使用PyString_FromStringAndSize进行了一些调整。 1}}和std::string构造函数,当以另一种方式接受大小参数时。

这是一个非常旧的SWIG版本 - 我认为新版本中的内置转换模板已经更新以自动完成。是否可能问题出现在C ++方面? (例如,在Mark Tolonen的示例中,第一个示例由于在没有size参数的构造函数调用中嵌入NULL而被截断)。

答案 1 :(得分:1)

可能是字符串的构造方式。考虑:

string blah(const string& x)
{
    string y("abc\x00def");
    return x + y;
}

string blah2(const string& x)
{
    string y("abc\x00def",7);
    return x + y;
}

从Python调用这些:

>>> import x
>>> x.blah('abc\x00def')
'abc\x00defabc'
>>> x.blah2('abc\x00def')
'abc\x00defabc\x00xyz'

std::string(const char*)的构造函数在NULL处停止,但很明显SWIG可以传入并返回其中带有NULL的字符串。