【问题标题】:Is an explicit NUL-byte necessary at the end of a bytearray for cython to be able to convert it to a null-terminated C-string在字节数组的末尾是否需要显式的 NUL 字节,以便 cython 能够将其转换为以 null 结尾的 C 字符串
【发布时间】: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


    【解决方案1】:

    我认为它是安全的(至少在 Python 3 中),但我会有点警惕。

    Cython 使用 C-API 函数 PyByteArray_AsStringPython3 documentation for it 表示“返回的数组总是附加一个额外的空字节。” Python2 version 没有该注释,因此很难确定它是否安全。

    实际上,我认为 Python 通过总是将字节数组过度分配 1 并以 NULL 终止它们来处理这个问题(参见 source code 以获取这样做的一个示例)。

    有点谨慎的唯一原因是字节数组(以及 Python 字符串)在字符串中包含 0 字节是完全可以接受的,因此它不能很好地指示结束在哪里。因此,无论如何,你真的应该使用他们的len。 (虽然这是一个弱论点,特别是因为你可能是初始化它们的人,所以你知道这是否应该是真的)


    (我的这个答案的初始版本有一些关于 _PyByteArray_empty_string 的内容。@ead 在 cmets 中指出我对此有误,因此将其编辑掉......)

    【讨论】:

    • 感谢这次伟大的调查。这是一大堆信息 - 需要一些时间来消化它。在我看来,_PyByteArray_empty_string 似乎是空终止的:github.com/python/cpython/blob/…。所以对 Python3 来说似乎是安全的。
    • 您的第二点非常有效。但是,在这种情况下,C-API 中的问题需要一个以 null 结尾的字符串,并且有时无法更改。
    • _PyByteArray_empty_string 的好地方,我只看到了声明(而不是定义)并得出了错误的结论。应该没问题的。
    • 在我看来,Python2 似乎也附加了一个尾随零(例如github.com/python/cpython/blob/2.7/Objects/…)。可能这是文档中的一个错误 - 在 Python3 中它已在一段时间前修复 (github.com/python/cpython/commit/…) ,但未移植到 2.7。我提交了一份错误报告 (bugs.python.org/issue33740),希望这些人能证实我的假设 - 但到目前为止没有任何反应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多