使用 c++ 中的 cppyy 读取 char16_t* 字符串

Read char16_t* String with cppyy from c++

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

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 方法不起作用:

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

完成了文档并成功地包装了除此之外的所有内容。非常感谢提示。

恐怕cppyy总是把char16_t*解释为Python unicode字符串(包括BOM和Python的特定编码),这太聪明了一半而不是将其视为低级数组或输出参数。我可能 fix/improve 其中一些,但现在,这里有一个解决方法可以帮助您解决这个问题:

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 字符串的事实,并只是让它传递指针。