将带有内部空字符的python2.7字符串传递给c++

2024-09-27 20:21:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在swig绑定中,有没有方法将中间有空字符的python2.7字符串(比如foo\0bar)传递给c++代码?你知道吗

python C bindings提供了两个函数:PyString_AsStringPyString_AsStringAndSize,但这两个函数都返回以null结尾的字符串。你知道吗


Tags: 方法函数字符串代码foo结尾bindingsnull
1条回答
网友
1楼 · 发布于 2024-09-27 20:21:02

正如PyString_AsStringAndSize的文档所说,它保留内部空字符,除非您为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'

正是你想要的,对吧?你知道吗

<>(在C++中,你不必做所有烦人的事情来工作,我做了{{CD4>},首先使用^ {CD5>}而不是^ {< CD6>},以防止它太聪明,并制作字符串,然后将其转换成数组,因为不允许指针运算。)

相关问题 更多 >

    热门问题