QT中的char、float、QbyteArray数据间的转换

前提是你 提交于 2019-12-11 10:45:04

在QT开发上位机与单片机通信时,因通信协议包的数据类型有“char”和“float”类型,特此记录。协议包类型如下:

typedef struct{
    char data1;
    char data2;
    char data3;
    char data4;
    char dataGroup[5];
    float value;
    char data7;
}DataInit;

因为代码中需要计算每个字节的内存地址的数据的累加和,char类型的可以直接进行累加,而float类型的数据值无法直接进行累加,如果进行累加数据将会出错,这时就需要将float类型转化为char型。有以下两种方式:

1、可以重新定义协议包将float类型的数据更改为char 类型数组,例如:

typedef struct{
    char data1;
    char data2;
    char data3;
    char data4;
    char dataGroup[5];
    char floatData[4];
    char data7;
}DataInit;

因为float本身在内存中分配就为4个字节,所以可在定义时直接将其定义为内存大小是4个字节的char类型的数组,在应用时可再将float数据转换为char类型并存入char类型数组中,具体操作方式参考第二种方式。

2、原本的数据包类型不变,在应用时定义一个char类型的指针,指向float变量的内存地址,读取出float中的内存地址中的数据进行操作,方式如下:

DataInit temp;
char *point=(char*)&temp.value;
for(int i=0; i<(sizeof(temp)/sizeof(char)); i++,point++){
    temp.data7 +=*point;
}

该方式可避免计算数据类型的大小,可将float更方便的替换为其他类型数据。

char、float、或者自定义结构体的类型转化为QByteArray类型数据

在QT开发中,经常要使用到write()和readALL()函数,在QT的QIODecive类中,提供了这几种方式:

有时候我们需要将char、float或者自定义的结构体转化为QByteArray类型数据,可根据QByteArray的构造函数

定义:

typedef struct{
    unsigned char data1;   //无符号字符型
    unsignedchar data2;
    unsignedchar data3;
    unsignedchar data4;
    unsignedchar dataGroup[5];
    float Data[4];               //单晶度浮点型
    char data7;
}DataInit;

QByteArray ba((char*)&temp,sizeof(temp)); //开辟的内存大小为DataInit的内存大小,一般定义一个QByteArray的变量为2个字节,但这个方式开辟的内存大小为DataInit结构体的大小的字节的内存
qDebug()<<"ba :"<<ba.toHex()<<endl;  //将QByteArray数据转化为十六进制以字符串的方式输出,用来查看数据是否有被改变。
qDebug()<<"ba sizeof :"<<ba.size()<<endl; //将开辟的QByteArra变量的内存大小打印出来,用来查看内存字节数是否有被改变。
QIODeivce::write(ba);//将数据通过write()fa送出去。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!