我使用ctypes连接到外部库。这个库返回给我一个二进制缓冲区。接口看起来是这样的:将外部提供的缓冲区复制到字节的最有效方法是什么
int getBuff(unsigned char **buf, int *len);
图书馆还出口释放器,这样我可以释放缓冲区时,我用它做,但是这方面不存在问题给我,所以我不认为我们需要覆盖它。
在我的ctypes代码中,我将buf
参数表示为c_void_p
。我想尽可能有效地将这个缓冲区复制到一个字节对象中。
目前我有:
data = bytes(bytearray(ctypes.cast(buf, ctypes.POINTER(ctypes.c_ubyte*len.value))[0]))
其中buf
是c_void_p
和len
是c_int
。
据我了解,它执行两个副本。一次到bytearray对象,然后再次到bytes对象。
我怎样才能做到这一点只有一个副本?
我目前的工作主要集中在Python 2上,但在适当的时候,我也需要为Python 3提供支持。
在Python 3上,您应该能够删除'bytearray'调用。 – user2357112
为什么你在使用'c_void_p'来铸造而不是'buf = POINTER(c_char)'?然后'getBuff(byref(buf),byref(len))'和'data = buf [:len.value]'。 – eryksun
@eryksun:嗯。你可以切片ctypes指针?新闻给我。 – user2357112