Łączę się z biblioteką zewnętrzną za pomocą ctypes. Ta biblioteka zwraca mi binarny bufor. Interfejs wygląda następująco:Jaki jest najskuteczniejszy sposób kopiowania zewnętrznego dostarczonego bufora do bajtów
int getBuff(unsigned char **buf, int *len);
Biblioteka eksportuje również dealokator tak, że mogę zwolnić bufor, gdy jestem z nim zrobić, ale ten aspekt nie przedstawia żadnych problemów do mnie, więc nie sądzę, musimy na pokrycie tego.
W moim kodzie cctses reprezentuję argument buf
jako c_void_p
. Chciałbym skopiować ten bufor do obiektu bajtów tak wydajnie, jak to tylko możliwe.
W tej chwili mam:
data = bytes(bytearray(ctypes.cast(buf, ctypes.POINTER(ctypes.c_ubyte*len.value))[0]))
gdzie buf
jest c_void_p
i len
jest c_int
.
To, jak rozumiem, wykonuje dwie kopie. Raz do obiektu bytearray, a następnie ponownie do obiektu bajtów.
Jak mogę to zrobić za pomocą tylko jednej kopii?
Moje obecne wysiłki koncentrują się na Pythonie 2, ale w odpowiednim czasie będę musiał to również wspierać w Pythonie 3.
Na Pythonie 3, powinieneś być w stanie usunąć wywołanie 'bytearray'. – user2357112
Dlaczego używasz 'c_void_p' z rzutowaniem zamiast po prostu' buf = POINTER (c_char) '? Następnie 'getBuff (byref (buf), byref (len))' i 'dane = buf [: len.value]'. – eryksun
@eryksun: Huh. Możesz wyciąć wskaźnik ctypes? Wiadomości do mnie. – user2357112