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

How do I read a C char array into a python bytearray with cython?

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

cdef char *bp
cdef size_t size

如何将数组读入 Python 字节数组(或其他易于腌制的适当结构)?

三种相当简单的方法:

  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 稍微加速)


我认为您在使用 ctypes 时遇到的这个问题(基于您在评论中链接到的后续问题)是您无法将 C 指针传递给 ctypes Python 接口。如果您尝试将 char* 传递给 Python 函数,Cython 将尝试将其转换为字符串。这失败了,因为它停在第一个 0 元素(因此你需要大小)。因此,您没有向 ctypes 传递一个 char*,而是向它传递一个无意义的 Python 字符串。