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