【问题标题】:SWIG Python and C++ std::string null-termination problem [duplicate]SWIG Python 和 C++ std::string 空终止问题 [重复]
【发布时间】: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 vectorwould 工作得更好,但从技术上讲,std::string 应该能够在大多数情况下处理空值。这听起来像是一个 SWIG 问题。
  • @Lou: std::string 可以完美地处理 NUL 字符,如果不是只将指针传递给 char 数组,您还传递大小,它将读取整个内容而不管可能的内部 NUL。您提到的构造函数只是为了与 C 字符串兼容而提供的。

标签: c++ python string swig


【解决方案1】:

过去我不得不处理这个问题,我刚刚从 SWIG 获取了 std::string 转换模板,并对其进行了一些调整,以便在从 std::string 和 @ 创建 Python 字符串时使用 PyString_FromStringAndSize 987654324@ 构造函数,在走另一条路时接受大小参数。

不过,这是 SWIG 的一个非常旧的版本 - 我认为较新版本中的内置转换模板已更新为自动执行此操作。问题可能出在C ++方面吗? (例如,在 Mark Tolonen 的示例中,第一个示例由于在没有大小参数的构造函数调用中嵌入 NULL 而被截断)。

【讨论】:

    【解决方案2】:

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

    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 的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2021-11-06
      • 2020-07-14
      • 1970-01-01
      • 2020-09-19
      • 2016-12-16
      相关资源
      最近更新 更多