• 用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和自定义结构体之间的相互转换

  • 相关阅读:
    C#递归拷贝文件夹下文件以及文件夹
    C# 获取文件名、目录、后缀、无后缀文件名、扩展名
    C#递归得到特定文件夹下问件
    Are you seeing high number of busyio or busyworker threads in the timeout exception?
    减少查询中的资源使用
    SQL性能优化前期准备-清除缓存、开启IO统计
    Sql server 存储过程批量插入若干数据。
    python读取excel中单元格的内容返回的5种类型
    Python读取excel数据类型处理
    【转】 如何导入excel数据到数据库,并解决导入时间格式问题
  • 原文地址:https://www.cnblogs.com/sggggr/p/14872745.html
Copyright © 2020-2023  润新知