• 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  
  • 相关阅读:
    【GoLang】转载:我为什么放弃Go语言,哈哈
    【GoLang】golang runtime 调度原理
    【GoLang】golang 微服务框架 介绍
    Redis缓存与springboot集成
    Redis分布式锁
    springboot配置文件的配置
    分布式事务之学习
    快速学习
    CAP定理为什么只能同时满足两个
    requestMapping之地址映射
  • 原文地址:https://www.cnblogs.com/taurusfy/p/9321883.html
Copyright © 2020-2023  润新知