首页 > 技术文章 > python调用c/c++ (入参出参为指针)

taurusfy 2018-07-17 10:12 原文

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括起来 ,否则有可能报错
 
 1 extern "C"{
 2 int foo(int len,char *p,char* ret)
 3 {
 4     __int64 a1 = 0x36;
 5     __int64 a2 = 0x100;
 6     __int64 a3 = 0xb5547;
 7     
 8     int j;
 9     char xz[100]={};
10     memcpy(xz,p,len);
11     printf("your input is %s,len xz=%d\n",xz,strlen(xz));
12 
13     int* pResult = new int[100];//密文
14     int i;
15     for(i = 0; i < strlen(xz); i++)
16     {
17         int result1 = rsa_mod(xz[i],0,0x101,0,0xb5547,0);
18         pResult[i] = swapEndian(result1);
19          //printf("0x%04X ",pResult[i]);
20     }
21     memcpy((char *)ret,(char *)pResult,4*strlen(xz));
22     return 0;
23 }
24 }

 

 

0x02 ctypes调用so

入参使用ctypes.c_char_p创建,出参需要使用ctypes.create_string_buffer创建内存,否则so中的内存在用完就释放了,无法传出来

 1 import ctypes
 2 
 3 def callfoo(str_in):
 4     #print 'input:\n%s' %str_in
 5     #调用库
 6     input = ctypes.c_char_p()  #对应c指针类型 char *p
 7     input.value=str_in  #字符串赋值
 8     ll = ctypes.cdll.LoadLibrary
 9     lib = ll("./libcallfoo.so")  #调用so
10     p=ctypes.create_string_buffer(4*len(str_in)) #申请出参的内存大小
11     lib.foo(len(str_in), input, p)  
12     print p.raw    #出参的访问方式
13  

 

推荐阅读