我有一个包含字节及其大小的数组:
cdef char *bp
cdef size_t size
如何将数组读入Python bytearray(或其他可以轻松pickle的适当结构)?
答案 0 :(得分:2)
三种合理简单的方法:
使用我在评论中建议的相应C API函数:
from cpython.bytes cimport PyBytes_FromStringAndSize
output = PyBytes_FromStringAndSize(bp,size)
这会产生一个副本,这可能是一个足够大的字符串的问题。对于Python 2,函数的名称相似,但使用PyString
而不是PyBytes
。
使用类型化的内存视图查看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*
传递给Python函数,Cython将尝试将其转换为字符串。这会失败,因为它在第0个元素处停止(因此您需要大小)。因此,您不能通过char*
传递ctypes,而是将它传递给无意义的Python字符串。