使用用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. How to delete deployed process definition in activiti?

    https://community.alfresco.com/thread/219767-how-to-delete-deployed-process

  2. js css样式操作代码(批量操作)

    js css样式操作代码(批量操作) 作者: 字体:[增加 减小] 类型:转载 时间:2009-10-09   用js控制css样式,能让网页达到良好的的用户体验甚至是动画的效果.并且考虑到效率.   ...

  3. helm 替换源的方法

    网上找了一个 helm 替换源的方法 挺好用的 mark 一下 helm repo remove stable helm repo add stable https://kubernetes.oss- ...

  4. [转帖] tmux 的使用说明

    之前曾经看过 tmux 的简介 但是一直不会用 这次 看了下 原来是这么处理 不过 用windows 多了 还是感觉鼠标 操作多一些 全键盘操作的习惯 还是没有养成. 原贴地址: https://ww ...

  5. Redis的相关问题总结

    一.Redis的优缺点及适用场景 Redis 是一个基于内存的高性能key-value数据库.很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘 ...

  6. Asp.Net Mvc的几个小问题

    突然想到一些小问题,对写代码影响不大,当是又很实用. MVC 中视图中的model的大小写问题,什么时候用大写,什么时候用小写? 所谓强类型视图,就是通过@model指令指明当前Model(属性)的具 ...

  7. MongoDB-数据&权限管理(4)

    数据备份与恢复 mongodump -h ip:port -d 数据库名称 -o 保存路径 # 备份 mongorestore -h ip:port -d 数据库名称 --dir 文件夹路径 # 恢复 ...

  8. 1019C Sergey's problem(思维)

    题意: 找出来一个点集S  使得S中的点不能互相通过一步到达 并且S中的点 可以在小于等于2的步数下到达所有的点 要父结点 不要子结点 这样就求出来一个点集S‘  而S'中可能存在 v -> u ...

  9. 【BZOJ3489】A simple rmq problem(KD-Tree)

    [BZOJ3489]A simple rmq problem(KD-Tree) 题面 BZOJ 题解 直接做肯定不好做,首先我们知道我们是一个二维平面数点,但是限制区间只能出现一次很不好办,那么我们给 ...

  10. BZOJ2738 矩阵乘法 【整体二分 + BIT】

    题目链接 BZOJ2738 题解 将矩阵中的位置取出来按权值排序 直接整体二分 + 二维BIT即可 #include<algorithm> #include<iostream> ...