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

SWIG Python and C++ std::string null-termination problem

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How Python can get binary data(char*) from C++ by SWIG?

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

1
WrapperGet(const std::string& key);

如果从Python调用带有包含NUL字符(例如二进制数据)的字符串参数,那么STD::字符串在NUL字符中被截断,这是我的问题,因为它不可能处理二进制数据。

有趣的是,另一种方法非常有效:

1
std::string WrapperResult();

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

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

感谢大家的想法和时间!


我以前必须处理这个问题,我刚从Swig中获取了std::string转换模板,并对其进行了一些修改,以便在从std::string创建python字符串时使用PyString_FromStringAndSize,而std::string构造函数在执行其他操作时接受大小参数。

不过,这是一个非常老的swig版本,我认为新版本中的内置转换模板已经被自动更新了。问题可能是在C++方面吗?(例如,在MarkTolonen的示例中,第一个示例由于没有大小参数的构造函数调用中嵌入了空值而被截断)。


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

1
2
3
4
5
6
7
8
9
10
11
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调用这些:

1
2
3
4
5
>>> import x
>>> x.blah('abc\x00def')
'abc\x00defabc'
>>> x.blah2('abc\x00def')
'abc\x00defabc\x00xyz'

std::string(const char*)的构造函数在空值处停止,但显然swig可以传入并返回其中包含空值的字符串。