代码之家  ›  专栏  ›  技术社区  ›  The Unfun Cat

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

  •  3
  • The Unfun Cat  · 技术社区  · 7 年前

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

    cdef char *bp
    cdef size_t size
    

    如何将数组读入Python bytearray(或另一个易于处理的适当结构)?

    1 回复  |  直到 7 年前
        1
  •  4
  •   DavidW    7 年前

    有三种简单易行的方法:

    1. 按照我在评论中的建议,使用适当的C API函数:

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

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

    2. 使用类型化的memoryview查看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* Cython将尝试将其转换为字符串。这会失败,因为它在第一个0元素处停止(因此需要大小)。因此,您没有通过C类型a char字符* ,您传递的是一个无意义的Python字符串。