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

在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送出去。

 

Qt,如果你有一个`QByteArray`(字节数组)存储了十六进制数据,并想要将其转换为带符号的浮点数(如`float`),你需要先解析十六进制字符串,然后根据其长度和前缀(如果是单精度或双精度)来转换。 例如,对于单精度(32位)浮点数,你可以按照这样的步骤操作: 1. 将十六进制字符串分为两个部分,前4个字符代表小数点前的部分,后8个字符(如果存在的话)代表小数点后的部分。 2. 分别将这两个部分转换成对应的无符号整数。 3. 对于小数部分,通常需要乘以16的相应次方(比如`0x1p+X`格式的`X`),因为浮点数的小数部分是以指数形式表示的。 4. 合并这两个整数,将有符号整数转换为`float`,注意正负符号取决于十六进制的第一个字符(对于小端模式的系统,这通常是第一位)。 如果涉及到双精度(64位)浮点数,处理过程类似,只是需要处理更多的字节。 以下是一个简单的示例,假设你已经有了一个名为`hexString`的`QByteArray`: ```cpp #include <QString> #include <QByteArray> #include <QLatin1Char> #include <QDataStream> // ... (假设已经读取了十六进制字符串到hexString) // 拆分十六进制字符串 QString intPart = hexString.left(8); QString fracPart = hexString.mid(8); // 转换为无符号整数 quint32 uintIntPart = qint32(intPart.toHex().toUpper()); quint32 uintFracPart = qint32(fracPart.remove('p').toHex().toUpper()); // 计算指数和整数部分 int exponent = QByteArray{fracPart}.toInt(); quint64 floatNum = quint64(uintIntPart) << exponent; // 如果是双精度,这里会需要处理另外8位 if (hexString.length() > 16) { // ... } // 将数值转换为带符号float bool isNegative = hexString.at(0) == QLatin1Char('-'); float signedFloat = static_cast<float>(isNegative ? -floatNum : floatNum); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值