При преобразовании bytearray
-объекта (или bytes
-объекта в этом отношении) в C-строку, cython-документация рекомендует использовать следующее:
cdef char * cstr = py_bytearray
нет никаких служебных данных, поскольку cstr
указывает на буфер объекта bytearray
.
Однако строки C заканчиваются нулем и, следовательно,чтобы иметь возможность передавать cstr
в C-функцию, она также должна заканчиваться нулем.Cython-документация не предоставляет никакой информации о том, заканчиваются ли получающиеся C-строки нулем.
Можно явно добавить NUL
-байт к byarray
-объекту, например, с помощьюиспользуя 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'))
печатает нужный«text» в stdout (который, в случае с IPython-ноутбуком, явно не выводится в браузере).
Но является ли это счастливым совпадением или есть гарантия, что буферобъект bytearray (или объект bytes) завершается нулем?