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    #出参的访问方式