有三种简单易行的方法:
-
按照我在评论中的建议,使用适当的C API函数:
from cpython.bytes cimport PyBytes_FromStringAndSize
output = PyBytes_FromStringAndSize(bp,size)
这将生成一个副本,这可能是一个足够大的字符串的问题。对于Python 2,函数的名称类似,但
PyString
而不是
PyBytes
。
-
使用类型化的memoryview查看char指针,从中获取numpy数组:
cdef char[::1] mview = <char[:size:1]>(bp)
output = np.asarray(mview)
这不应该复制,所以如果很大的话,效率可能会更高。
-
手动复制:
output = bytearray(size)
for i in range(size):
output[i] = bp[i]
(如果需要,可以使用Cython稍微加快速度)
我认为您在ctypes方面遇到的问题(基于您在评论中链接到的后续问题)是,您无法将C指针传递给ctypes Python接口。如果你想通过
char*
Cython将尝试将其转换为字符串。这会失败,因为它在第一个0元素处停止(因此需要大小)。因此,您没有通过C类型a
char字符*
,您传递的是一个无意义的Python字符串。