python调用c/c++ (入参出参为指针)
python可以使用ctypes库调用c++编译的so库函数
0x01 c/c++编译为so库文件
编译C文件
gcc -o libpycallfoo.so -shared -fPIC rsa.c
编译C++文件
g++ -o libcallfoo.so -shared -fPIC rsa.cpp
对于cpp文件需要用extern “C”{} 把main括起来 ,否则有可能报错
extern "C"{
int foo(int len,char *p,char* ret)
{
__int64 a1 = 0x36;
__int64 a2 = 0x100;
__int64 a3 = 0xb5547;
int j;
char xz[100]={};
memcpy(xz,p,len);
printf("your input is %s,len xz=%d\n",xz,strlen(xz));
int* pResult = new int[100];//密文
int i;
for(i = 0; i < strlen(xz); i++)
{
int result1 = rsa_mod(xz[i],0,0x101,0,0xb5547,0);
pResult[i] = swapEndian(result1);
//printf("0x%04X ",pResult[i]);
}
memcpy((char *)ret,(char *)pResult,4*strlen(xz));
return 0;
}
}
0x02 ctypes调用so
入参使用ctypes.c_char_p创建,出参需要使用ctypes.create_string_buffer创建内存,否则so中的内存在用完就释放了,无法传出来
import ctypes
def callfoo(str_in):
#print 'input:\n%s' %str_in
#调用库
input = ctypes.c_char_p() #对应c指针类型 char *p
input.value=str_in #字符串赋值
ll = ctypes.cdll.LoadLibrary
lib = ll("./libcallfoo.so") #调用so
p=ctypes.create_string_buffer(4*len(str_in)) #申请出参的内存大小
lib.foo(len(str_in), input, p)
print p.raw #出参的访问方式