2016-05-24 2 views
1

Я создал функцию в C, которая принимает значения int и char * buffer в качестве аргументов. Я хотел бы использовать ctypes для вызова этой функции из python и передачи в python byteArray. Я знаю, что сначала вы должны скомпилировать файл C в общую библиотеку (файл .so) и использовать ctypes для вызова этой функции. Вот код, который у меня есть.Как использовать ctypes для передачи byteArray в C-функцию, которая принимает char * в качестве аргумента?

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); 
    } 
} 

А вот файл питон:

import ctypes 

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

В основном я хочу, чтобы вызвать метод C от питона, пройти через массив байтов питона, и он итерацию через массив и печать каждый элемент

ответ

1

минимальная вам нужно (Python 2) является:

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

Но также полезно объявлять типы аргументов и возвращаемые значения. Полная программа:

#!python2 
import ctypes 

encryptPy = ctypes.CDLL('/home/aradhak/Documents/libencrypt.so') 

encryptPy.encrypt.argtypes = (ctypes.c_int,ctypes.c_char_p) 
encryptPy.encrypt.restype = None 
encryptPy.decrypt.argtypes = (ctypes.c_int,ctypes.c_char_p) 
encryptPy.decrypt.restype = None 

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

Обратите внимание, что при передаче строки байтового байта считайте буфер неизменным. В этом случае вы только читаете буфер, но если вам нужно, чтобы функция C мутировать использование строки:

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

Это работает, как хорошо, но будет длиной 6. Нуль-терминатора будет включен.

hello = ctypes.create_string_buffer('hello') 
Смежные вопросы