zoukankan      html  css  js  c++  java
  • 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括起来 ,否则有可能报错
     
     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
    ",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:
    %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  
  • 相关阅读:
    Photoshop制作倒影的两种方法
    用CSS正确显示人民币符号的HTML转义字符
    CSS水平居中/垂直居中的N个方法
    有利于SEO的DIV+CSS的命名规则
    引用视频全屏播放代码
    分享:PHP获取MAC地址的实现代码
    设置nginx禁止通过IP访问服务器的方法
    php文件上传的例子
    apache开启gzip的方法
    perl命令批量替换文件内容
  • 原文地址:https://www.cnblogs.com/taurusfy/p/9321883.html
Copyright © 2011-2022 走看看