使用用python调用c代码中,从外部传入一个固定大小的内存空间,这段内存需要是可写的

首先看下c中的函数

typedef struct ModelData
{
unsigned int model_len; //数据长度
char* model_data;
}Model_Data; int SessionBegin(INST nst, Model_Data* model_data);

 

首先再python中定义对应的结构体

class ISV_ModelData(Structure):
_fields_ = [
('model_len', c_uint),
('model_data', c_void_p)
]

虽然c中的结构体是char *,这里并没有定义成c_char_p,因为这段内存需要支持写入,并且便于后面读取。

    model_res = Model_Data()
model_len = 1024 * 1024
raw_memory = bytearray(model_len )
ctypes_raw_type = (c_char * model_len )
ctypes_raw_memory = ctypes_raw_type.from_buffer(raw_memory)
# 通过ctypes对象的addressof获得内存指针的值
raw_address = addressof(ctypes_raw_memory)
model_res.model_data = c_void_p(raw_address)
model_res.model_len = model_len

  这样我们就有了一段1024*1024的空白的内存空间

ret = so.SessionBegin(inst, byref(model_res))

  

同样也可以传入一段有内容的空间

    model_res = Model_Data()
raw_model_data = open('xx', 'rb').read()
raw_memory = bytearray(raw_model_data)
ctypes_raw_type = (c_char * len(raw_model_data))
ctypes_raw_memory = ctypes_raw_type.from_buffer(raw_memory)
# 通过ctypes对象的addressof获得内存指针的值
raw_address = addressof(ctypes_raw_memory)
model_res.model_data = c_void_p(raw_address)
model_res.model_len = len(raw_model_data)

  

当c中处理完成后,如何读取里面的内容,这里如果c_char_p的话就不好处理了

model_out_value = (c_int8 * model_res.model_len).from_address(model_res.model_data)
model_out_value_str = struct.pack("%sb" % model_res.model_len, *model_out_value)

以上都是在python2中进行测试的

python与C交互中传入与读取内存空间的更多相关文章

  1. C语言中计算变量占用内存空间

    C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:

  2. 父类是在子类创建对象时候 在子类中创建一个super内存空间

    父类是在子类创建对象时候 在子类中创建一个super内存空间

  3. python之从文件中按行读取数据

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' # 从文件中按行读取数据 file = open(& ...

  4. MFC中psz_data无法读取内存的错误

    1.项目 ->属性->C/C++ -->预编译头文件,改为“不适用预编译头” 出现ATL::CSimplestring错误,psz_data无法读取内存 2.修改如下:鼠标右击 项目 ...

  5. python与mysql交互中的各种坑

    开始学python 交互MySQLdb,踩了很多坑 第一个 %d format: a number is required, not str 参照以下博客: https://blog.csdn.net ...

  6. windows 32位系统中进程最大可用内存空间为3GB (转)

    http://msdn.microsoft.com/zh-cn/library/ms189334.aspx 进程地址空间 所有 32 位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 ...

  7. 026 Android 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+读取内存空间、手机进程信息+常驻悬浮框

    1.目标效果 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+常驻悬浮框 2.页面布局文件 (1)activity_process_manager.xml <?xml ...

  8. Python的用户交互程序及格式化输出

    1.  用户输入 在Python 3 中,用户输入用input()函数即可实现用户交互程序. 例如,我们根据程序提示输入用户名和密码,并且打印输入的信息. 2. 字符串格式化输出 例如,我们根据程序提 ...

  9. python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件

    python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 python操作txt文件中 ...

随机推荐

  1. PAT 甲级 1078 Hashing

    https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592 The task of this probl ...

  2. 格式化输出Json对象

    1.调用方式: alert(JsonUti.convertToString(jsonObj)); //jsonObj为json对象. 2.格式化输出Json对象方法定义: var JsonUti = ...

  3. [转载] 什么是istio 官网内容

    网址:https://preliminary.istio.io/zh/docs/concepts/what-is-istio/ mark 一下 1.0 昨天刚发布. 2018.7.31 Istio 是 ...

  4. laravel DB 执行 mysql函数或者字段

    使用laravel框架中的DB查询mysql数据库的时候,综合遇到执行mysql函数或者,自定义字段,一般情况下DB会把传入的函数当做字段处理 方法如下: DB:raw('函数或者字段'); DB:w ...

  5. CORS跨域资源共享简述

    什么是CORS? 默认情况下,为预防某些而已行为,浏览器的XHR对象只能访问来源于同一个域中的资源.但是我们在日常实际开发中,常常会遇到跨域请求的需求,因此就出现了一种跨域请求的方案:CORS(Cro ...

  6. hdu 4747 Mex (2013 ACM/ICPC Asia Regional Hangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 思路: 比赛打得太菜了,不想写....线段树莽一下 实现代码: #include<iost ...

  7. php中的动态变量的一个应用

    原文:https://www.cnblogs.com/JimmyBright/p/9869168.html 某些情况下,可以代替switch语句,大大简化代码,非常有意思哦 $list = [ [ ' ...

  8. 架构师成长之路1.2-多功能系统信息统计工具dstat

    点击返回架构师成长之路 架构师成长之路1.2-多功能系统信息统计工具dstat dstat命令是一个用来替换vmstat.iostat.netstat.nfsstat和ifstat这些命令的工具,是一 ...

  9. 学习Spring Boot:(十六)使用Shiro与JWT 实现认证服务

    前言 需要把Web应用做成无状态的,即服务器端无状态,就是说服务器端不会存储像会话这种东西,而是每次请求时access_token进行资源访问.这里我们将使用 JWT 1,基于散列的消息认证码,使用一 ...

  10. 界面编程之QT的线程20180731

    /*******************************************************************************************/ 一.为什么需 ...