带符号浮点数Qbytearray相互转化
在工业应用中,数据传输十分常见,其中最常见是应用TCP/Modebus协议,将本地数据库中的数据传到其他地方,这里便涉及数据的转化,其中将带符号的浮点数转成指令传输给对方便是本文章的主要内容。
我们知道,在qbytearray的数据解析中,浮点数float占据四个字节,其中最高位为符号位,那我们在传输过程中,先取其绝对值,转化为十六进制,再根据正负修改最高位,根据这个思路实现其代码。
第一步,从数据库中取相应的数据
QSqlQuery query(db);
QString temSql = "SELECT currdata FROM current_data order by id";
query.exec(temSql);
while(query.next())
{
curr_data.append(query.value(0).toDouble());
}
第二步,取绝对值,转化为十六进制
float ss = fabs(curr_data.at(i)); //取绝对值
uchar c[4];
bool ok;
int a = *((int *)&ss);
QString float_str = QString("%1").arg(a,4,16,QLatin1Char('0'));
QString str_spilt;
qDebug() << float_str ;
for(int j = 0; j < 4; j++)
{
str_spilt = float_str.mid(j*2, 2); //隔两个分割
c[j] = str_spilt.toInt(&ok, 16);
}
第三步,判断正负,修改最高位
if(curr_data.at(i) < 0)
c[0] =(c[0] | 0x80);
最后,将uchar数组的值,赋给qbytearray,通过TCP 方式发出去即可。
最后将四字节的qbytearray转化成float
quint32 data = quint32(byte0 << 24 | byte1 <<16 | byte2 <<8 | byte3 << 0);
const float *f = reinterpret_cast<const float *>(&data);
return *f;