2016-05-24 11 views
1

Ich habe eine Funktion in C erstellt, die eine int-Größe und einen char * -Puffer als Argumente verwendet. Ich möchte Ctypes verwenden, um diese Funktion von Python aufzurufen und in einem Python-ByteArray übergeben. Ich weiß, dass Sie zuerst die C-Datei in eine gemeinsame Bibliothek (.so-Datei) kompilieren müssen und Ctypes verwenden, um diese Funktion aufzurufen. Hier ist der Code, den ich bisher habe.Wie kann ich mit Ctypes ein ByteArray in eine C-Funktion übergeben, die ein char * als Argument verwendet?

encrypt.c:

#include <stdio.h> 
void encrypt(int size, unsigned char *buffer); 
void decrypt(int size, unsigned char *buffer); 

void encrypt(int size, unsigned char *buffer){ 
    for(int i=0; i<size; i++){ 
     unsigned char c = buffer[i]; 
     printf("%c",c); 
    } 
} 
void decrypt(int size, unsigned char *buffer){ 
    for(int i=0; i<size; i++){ 
     unsigned char c = buffer[i]; 
     printf("%c",c); 
    } 
} 

Und hier ist die Python-Datei:

import ctypes 

encryptPy = ctypes.CDLL('/home/aradhak/Documents/libencrypt.so') 
hello = "hello" 
byteHello = bytearray(hello) 
encryptPy.encrypt(5,byteHello) 
encryptPy.decrypt(5,byteHello) 

Grundsätzlich möchte ich die C-Methode von Python nennen, ein Python-Byte-Array durchlaufen, und haben es iterieren durch die Anordnung und drucken jedes Element

Antwort

1

die minimale Sie (Python 2) müssen, ist:

hello = "hello" 
encryptPy.encrypt(5,hello) 
encryptPy.decrypt(5,hello) 

Aber es ist auch gut, die Argumenttypen und Rückgabewerte zu deklarieren. Vollständiges Programm:

Beachten Sie, dass beim Übergeben einer Python-Bytezeichenfolge der Puffer unveränderlich ist. In diesem Fall lesen Sie den Puffer, aber wenn Sie die C-Funktion die Zeichenfolge Verwendung mutieren lassen müssen:

hello = ctypes.create_string_buffer(5,'hello') 

Dies funktioniert auch, aber wird Länge 6. abschließende Null ist enthalten.

hello = ctypes.create_string_buffer('hello')