如何使用 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 字节数组(或其他易于腌制的适当结构)?
三种相当简单的方法:
按照我在评论中的建议使用适当的 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 元素(因此你需要大小)。因此,您没有向 ctypes 传递一个 char*
,而是向它传递一个无意义的 Python 字符串。
我有一个字节数组及其大小:
cdef char *bp
cdef size_t size
如何将数组读入 Python 字节数组(或其他易于腌制的适当结构)?
三种相当简单的方法:
按照我在评论中的建议使用适当的 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 元素(因此你需要大小)。因此,您没有向 ctypes 传递一个 char*
,而是向它传递一个无意义的 Python 字符串。