如何使用cython将C char数组读入python bytearray?

时间:2018-05-08 07:48:18

标签: cython

我有一个包含字节及其大小的数组:

cdef char *bp
cdef size_t size

如何将数组读入Python bytearray(或其他可以轻松pickle的适当结构)?

1 个答案:

答案 0 :(得分:2)

三种合理简单的方法:

  1. 使用我在评论中建议的相应C API函数:

     from cpython.bytes cimport PyBytes_FromStringAndSize
    
     output = PyBytes_FromStringAndSize(bp,size)
    

    这会产生一个副本,这可能是一个足够大的字符串的问题。对于Python 2,函数的名称相似,但使用PyString而不是PyBytes

  2. 使用类型化的内存视图查看char指针,从中获取一个numpy数组:

    cdef char[::1] mview = <char[:size:1]>(bp)
    output = np.asarray(mview)
    

    这不应该复制,所以如果大的话可能更有效。

  3. 手动复制:

     output = bytearray(size)
     for i in range(size):
         output[i] = bp[i]
    

    (如果需要,可以通过Cython加速)

  4. 我认为您使用ctypes(基于您在注释中链接的后续问题)的这个问题是您无法将C指针传递给ctypes Python接口。如果您尝试将char*传递给Python函数,Cython将尝试将其转换为字符串。这会失败,因为它在第0个元素处停止(因此您需要大小)。因此,您不能通过char*传递ctypes,而是将它传递给无意义的Python字符串。