用python做科学计算(一)C语言读取python生成的二进制文件

在C语言中我们可以通过struct关键字定义结构类型,结构中的字段占据连续的内存空间,每个结构体
占用的内存大小都相同,因此可以很容易地定义结构数组。和C语言一样,在NumPy中也很容易对这
种结构数组进行操作。只要NumPy中的结构定义和C语言中的定义相同,NumPy就可以很方便地读取
C语言的结构数组的二进制数据,转换为NumPy的结构数组。

Python的结构数组

import numpy as np
persontype = np.dtype({
'names':['name', 'age', 'weight'],
'formats':['S32','i', 'f']})
a = np.array([("Zhang",32,75.5),("Wang",24,65.2)],
dtype=persontype)

通过调用a.tostring或者a.tofile方法,可以直接输出数组a的二进制形式:

a.tofile("test.bin")

C语言的结构体为了内存寻址方便,会自动的添加一些填充用的字节,这叫做内存对齐。例如
如果把下面的name[32]改为name[30]的话,由于内存对齐问题,在name和age中间会填补两
个字节,最终的结构体大小不会改变。因此如果numpy中的所配置的内存大小不符合C语言的
对齐规范的话,将会出现数据错位。为了解决这个问题,在创建dtype对象时,可以传递参数
align=True,这样numpy的结构数组的内存对齐和C语言的结构体就一致了。

C语言读取

int main(int argc, char *argv[])
{
   /* FILE *fp=NULL;
    int i;
    fp=fopen("D:\Code\QtWorkPlace\day02\calculator\test.bin","rb");
    fread(p,sizeof (struct person),2,fp);
    fclose(fp);
    for(i=0;i<2;i++)
    {
        printf("%s  %d  %f
",p[i].name,p[i].age,p[i].weight);
    }
    getchar();*/



    /*QByteArray aa;
    QFile file("D:\Code\QtWorkPlace\day02\calculator\test.bin");
    file.open(QIODevice::ReadOnly);
    char *bf;
    aa=file.readAll();
    bf=aa.data();
    file.close();
    filesize=aa.length();

    for(int i=0;i<2;i++)
    {
        p[i]=*(reinterpret_cast<person_st *>(aa.data()+i*sizeof (person_st)));
        printf("%s  %d  %f
",p[i].name,p[i].age,p[i].weight);
    }*/

    QFile file("D:\Code\QtWorkPlace\day02\calculator\test.bin");
    file.open(QIODevice::ReadOnly);
    QDataStream in(&file);
    char s[2048];
    int len;
    in.readRawData(s,2*sizeof (person_st));

    for(int i=0;i<2;i++)
    {
        p[i]=*(reinterpret_cast<person_st *>(s+i*sizeof (person_st)));
        printf("%s  %d  %f
",p[i].name,p[i].age,p[i].weight);
    }
}

这三种方法都可以,注意写对文件路径!

Qt中的QByteArray和自定义结构体之间的相互转换

  1. QByteArray转换为自定义结构体

custom_struct *struct_data = reinterpret_cast<custom_struct *>(array_data.data());
2. 自定义结构体转换为QByteArray

QByteArray array_data;
array_data.append((char*)&struct_data, sizeof(struct_data));

参考

Qt中的QByteArray和自定义结构体之间的相互转换

原文地址:https://www.cnblogs.com/sggggr/p/14872745.html