可能重复:
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()成员函数来获取字符串值。
感谢大家的想法和时间!
答案 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的字符串。