【发布时间】:2011-02-24 18:21:10
【问题描述】:
可能重复:
How Python can get binary data(char*) from C++ by SWIG?
我有一个可以从 Python 调用的基于 SWIG 的 C++ 接口。其中有一个函数,它有一个 std::string 参数。它看起来像这样:
WrapperGet(const std::string& key);
如果使用包含 NUL 字符(例如二进制数据)的字符串参数从 Python 调用它,则 std::string 在 NUL 字符处被截断,这是我的问题,因为它无法处理二进制数据.
有趣的是,其他方式也可以完美运行:
std::string WrapperResult();
此处返回的字符串可以包含不截断的二进制数据。有人知道必须做什么吗?
更新:我调试了 SWIG 生成的代码,结果发现错误出现在 C++ 大小的包装代码中:它使用 std::string 的 c_str() 成员函数来获取字符串值。
感谢大家的想法和时间!
【问题讨论】:
-
问题不在于 std::string,而在于 SWIG with std::string。你有如何编译 SWIG 来实现这一点吗?
-
不是他不应该使用std::string来表示NUL数据的问题。我对 SWIG 一无所知,但是如果您通过传递字符数组来构造字符串,您将遇到您所看到的问题。也许矢量
会更好。 -
@Lou, a vector
would 工作得更好,但从技术上讲,std::string 应该能够在大多数情况下处理空值。这听起来像是一个 SWIG 问题。 -
@Lou:
std::string可以完美地处理 NUL 字符,如果不是只将指针传递给 char 数组,您还传递大小,它将读取整个内容而不管可能的内部 NUL。您提到的构造函数只是为了与 C 字符串兼容而提供的。