我使用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