2024-09-27 20:21:02 发布
网友
在swig绑定中,有没有方法将中间有空字符的python2.7字符串(比如foo\0bar)传递给c++代码?你知道吗
foo\0bar
python C bindings提供了两个函数:PyString_AsString和PyString_AsStringAndSize,但这两个函数都返回以null结尾的字符串。你知道吗
PyString_AsString
PyString_AsStringAndSize
正如PyString_AsStringAndSize的文档所说,它保留内部空字符,除非您为length传递NULL。这显然是不打算做的(因为如果不知道长度的话,就不能处理带有内部空字符的字符串)。你知道吗
length
NULL
不管您是否需要一个空终止符,它都可以确保在结尾处有一个空终止符,但是如果这是不可接受的,那么很容易处理:只需将它返回的长度减少1。你知道吗
因此,除非您担心Python复制缓冲区只是为了添加一个不需要的空终止符(在这种情况下,我不会担心大多数创建字符串的方法,缓冲区中已经有了终止符)的潜在性能代价,否则这里应该不会有任何问题。你知道吗
为了证明这一点:
#!/usr/bin/env python2.7 from ctypes import * PyString_AsStringAndSize = pythonapi.PyString_AsStringAndSize PyString_AsStringAndSize.argtypes = [ py_object, POINTER(POINTER(c_int8)), POINTER(c_ssize_t)] PyString_AsStringAndSize.restype = c_int s = 'foo\0bar' buf = POINTER(c_int8)() size = c_ssize_t() res = PyString_AsStringAndSize(s, byref(buf), byref(size)) print res print size.value bufa = cast(buf, POINTER(c_int8 * size.value)) print bufa.contents[:size.value] print repr(''.join(chr(c) for c in bufa.contents[:size.value]))
输出为:
0 7 [102, 111, 111, 0, 98, 97, 114] 'foo\x00bar'
正是你想要的,对吧?你知道吗
正如
PyString_AsStringAndSize
的文档所说,它保留内部空字符,除非您为length
传递NULL
。这显然是不打算做的(因为如果不知道长度的话,就不能处理带有内部空字符的字符串)。你知道吗不管您是否需要一个空终止符,它都可以确保在结尾处有一个空终止符,但是如果这是不可接受的,那么很容易处理:只需将它返回的长度减少1。你知道吗
因此,除非您担心Python复制缓冲区只是为了添加一个不需要的空终止符(在这种情况下,我不会担心大多数创建字符串的方法,缓冲区中已经有了终止符)的潜在性能代价,否则这里应该不会有任何问题。你知道吗
为了证明这一点:
输出为:
正是你想要的,对吧?你知道吗
<>(在C++中,你不必做所有烦人的事情来工作,我做了{{CD4>},首先使用^ {CD5>}而不是^ {< CD6>},以防止它太聪明,并制作字符串,然后将其转换成数组,因为不允许指针运算。)相关问题 更多 >
编程相关推荐