代码之家  ›  专栏  ›  技术社区  ›  IanQ

包含空字符的bytearray中的PyByteArray_字符串的解决方法

  •  1
  • IanQ  · 技术社区  · 5 年前

    我有一些数据缓冲区,一个 PyByteArray ,我想提取 char * 从…起然后我想获取这个char*并从中创建一个stringstream。

    void CKKSwrapper::DeserializeContext(PyObject *obj) {
        // Is a PyByteArray object as determined by https://docs.python.org/3/c-api/bytearray.html#c.PyByteArray_Check
        PyObject_Print(obj, stdout, Py_PRINT_RAW);  // 1
        const char *s = PyByteArray_AsString(obj);  // 2
        std::cout << "Converted bytearray to string" << std::endl;  // 3 
        std::cout << s << std::endl;  // 4
    
    
        std::istringstream is(s);  // 5
        lbcrypto::CryptoContext<lbcrypto::DCRTPoly> new_cc; // 6
        Serial::Deserialize(new_cc, is, SerType::BINARY); // 7
    }
    

    二线 const char *s = PyByteArray_AsString(obj); 输出单个字符。从上一个问题 C++ c_str of std::string returns empty (标题不准确),我知道输入对象的基础数据, PyObject *obj NULL 里面的人物。

    基于 API 我看不到任何立即的解决办法。有人有什么建议吗?

    注意:从当前代码库中,我需要从

    Server: (C++ -> Python) -> (sockets) -> Client: (Python -> C++)

    所以我真的无法绕过这个物体。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Sam Varshavchik    5 年前

    如果你读 the description of all the PyByteArray 函数,您将发现一个名为 PyByteArray_Size

    std::string 有许多构造函数。其中一个构建了 从开始迭代器到结束迭代器。指针符合这些条件。所以,您应该能够构建一个完整的 因此:

    const char *ptr = PyByteArray_AsString(obj);
    size_t n=PyByteArray_Size(obj);
    
    std::string s{ptr, ptr+n};
    
    std::cout << s << std::endl;