C读取python结构数组

来源:互联网 发布:php怎么让一组数据相加 编辑:程序博客网 时间:2024/06/06 18:15

背景:

将python—numpy的结构数组保存到本地,然后用c将数据读取出来。

可能用到的知识:

  1. 在C语言中通过struct关键字定义结构类型,结构中的字段占据连续的内存空间,每个结构体占用的内存大小都相同,因此可以很容易地在此基础上定义结构数组。和C语言一样,在NumPy中也很容易对这种结构数组进行操作。只要NumPy中的结构定义和C语言中的定义相同,两者就可以很容易的读取对方结构数组的二进制数组。
  2. numpy创建结构数组:先创建一个dtype对象,通过其字典参数描述结构类型的各个字段。字典有两个关键字:names,formats。每个关键字对应的值都是一个列表。names定义结构中的每个字段名,而formats则定义每个字段的类型,类型描述前面我们可以添加 `|', `<' ,'>'字符,用这些字符可以控制字段值的字节顺序:(1) | : 忽视字节顺序 (2)< : 低位字节在前 (3)> : 高位字节在前。相当于大小尾个概念,一般字符串默认“|”,数值默认“<”。
  3. 内存对齐:C语言的结构体为了内存寻址方便,会自动的添加一些填充用的字节,这叫做内存对齐。例如:如果把下面的name[32]改为name[30]的话,由于内存对齐问题,在name和age中间会填补两个字节,最终的结构体大小不会改变。因此如果numpy中的所配置的内存大小不符合C语言的对齐规范的话,将会出现数据错位。为了解决这个问题,在创建dtype对象时,可以传递参数align=True,这样numpy的结构数组的内存对齐和C语言的结构体就一致了。

代码:

python:导出结构数组二进制形式

persontype = np.dtype({    'names':['name','age','weight'],    'formats':['S30','i','f']        }    ,align = True)an = np.array([('xm',32,75.5),('xq',23,65),("xn",4,65.6)],dtype = persontype)an.tofile("C:\\Users\\tinysoft\\Desktop\\test.bin")
C++:读取结构数组

#include <iostream>#include <cstdio> /* run this program using the console pauser or add your own getch, system("pause") or input loop */struct numpy{char name[30];int age;float weight;};int main(int argc, char** argv) {FILE *fp;fp = fopen("C:\\Users\\tinysoft\\Desktop\\test.bin","r");numpy buf[3];fread(buf,sizeof(numpy),3,fp);fclose(fp);for(int i = 0;i<3 ;i++){printf("%d : %s %d %f\n",i,buf[i].name,buf[i].age,buf[i].weight);}return 0;}