Je m'interface avec une bibliothèque externe en utilisant des ctypes. Cette bibliothèque me renvoie un tampon binaire. L'interface ressemble à ceci:Quel est le moyen le plus efficace pour copier un tampon fourni en externe en octets?
int getBuff(unsigned char **buf, int *len);
La bibliothèque exporte aussi deallocator pour que je puisse libérer le tampon quand je suis fait avec elle, mais cet aspect me pose pas de problème, donc je ne pense pas que nous avons besoin pour le couvrir. Dans mon code ctypes, je représente l'argument buf
comme c_void_p
. Je voudrais copier ce tampon dans un objet octets aussi efficacement que possible.
Au moment j'ai:
data = bytes(bytearray(ctypes.cast(buf, ctypes.POINTER(ctypes.c_ubyte*len.value))[0]))
où buf
est c_void_p
et len
est c_int
. Si je comprends bien, cela fait deux copies. Une fois à l'objet bytearray, puis de nouveau à l'objet bytes.
Comment puis-je faire cela avec une seule copie? Mes efforts actuels se sont concentrés sur Python 2, mais en temps voulu, je devrai également prendre en charge Python 3 pour Python 3.
Sur Python 3, vous devriez pouvoir supprimer l'appel 'bytearray'. – user2357112
Pourquoi utilisez-vous 'c_void_p' avec un cast au lieu de simplement' buf = POINTER (c_char) '? Ensuite 'getBuff (parref (buf), byref (len))' et 'data = buf [: len.value]'. – eryksun
@eryksun: Huh. Vous pouvez découper un pointeur ctypes? Nouvelles à moi. – user2357112