【发布时间】:2018-11-12 11:20:41
【问题描述】:
将bytearray-object(或bytes-object)转换为C-string时,cython-documentation建议使用以下内容:
cdef char * cstr = py_bytearray
没有开销,因为cstr 指向bytearray-object 的缓冲区。
但是,C 字符串是 null-terminated,因此为了能够将 cstr 传递给 C 函数,它也必须以空值结尾。 cython 文档不提供任何信息,即生成的 C 字符串是否以空值结尾。
可以将NUL-byte 显式添加到byarray-object,例如通过使用b'text\x00' 而不仅仅是`b'text'。然而这很麻烦,容易忘记,而且至少有实验证据表明不需要显式 NUL 字节:
%%cython
from libc.stdio cimport printf
def printit(py_bytearray):
cdef char *ptr = py_bytearray
printf("%s\n", ptr)
现在
printit(bytearray(b'text'))
将所需的“文本”打印到标准输出(在 IPython 笔记本的情况下,显然不是浏览器中显示的输出)。
但是这是一个幸运的巧合还是有保证,字节数组对象(或字节对象)的缓冲区是空终止的?
【问题讨论】:
标签: python-3.x cython cpython python-internals