【问题标题】:Read char16_t* String with cppyy from c++从 c++ 中用 cppyy 读取 char16_t* 字符串
【发布时间】:2020-05-04 14:06:07
【问题描述】:

cppyy 是我发现的唯一一个 Python 包,用于在 Linux 下使用 char16_t* 字符串包装 C++ 库。给定一个函数:

int ::func1(const char16_t* symbol, char16_t* data, const unsigned int length)
// [in] symbol, [out] data, [in] length
// Returns a string "data" of "length" dependent on keyword "symbol"

如何从函数中读取字符串“data”? ctypes-Approach 不起作用:

length = 10
val = ctypes.create_unicode_buffer(length)
cppyy.gbl.func1('Keyname', val, length)

通过文档工作并设法将所有内容都包含在此之外。非常感谢提示。

【问题讨论】:

    标签: python cppyy


    【解决方案1】:

    恐怕 cppyy 总是试图将char16_t* 解释为 Python unicode 字符串(包括 BOM 和 Python 的特定编码)而不是将其视为低级数组或外参数.我可能可以修复/改进其中的一些问题,但现在,这里有一个解决方法可以让你超越这一点:

    import cppyy
    import cppyy.ll
    
    cppyy.cppdef("""
    int func1_wrap(const char16_t* symbol, void* data, const unsigned int length) {
        return func1(symbol, (char16_t*)data, length);
    }
    """)
    
    def func1_pywrap(symbol, length):
        buf = cppyy.ll.array_new[cppyy.gbl.uint16_t](length)
        res = cppyy.gbl.func1_wrap(symbol, buf, length)
        return res, cppyy.ll.cast['char16_t*'](buf)
    
    cppyy.gbl.func1 = func1_pywrap
    
    result = cppyy.gbl.func1('Keyname', 5)
    print(result)
    

    各种强制转换只是为了让 cppyy 对它正在处理一个 unicode 字符串的事实视而不见,只是让它传递指针。

    【讨论】:

    • 别忘了删除数组:cppyy.ll.array_delete(buf) else: MemoryLeak `
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2021-09-13
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多