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