首先要理解double的存储方式,具体可查找相关的博客
本文实现的是将8个字节(存储为16进制的字符串)转化为对应的double类型
double MainWindow::qByteArraytodouble(QString qstr) { QByteArray byte; StringToHex(qstr,byte); double result; memcpy(&result, byte.data(), 8); return result; }其中StringToHex函数定义如下
/***********字符串转16进制数***********/ void MainWindow::StringToHex(QString str, QByteArray &senddata) { int hexdata,lowhexdata; int hexdatalen = 0; int len = str.length(); senddata.resize(len/2); char lstr,hstr; for(int i=0; i<len; ) { //char lstr, hstr=str[i].toLatin1(); if(hstr == ' ') { i++; continue; } i++; if(i >= len) break; lstr = str[i].toLatin1(); hexdata = ConvertHexChar(hstr); lowhexdata = ConvertHexChar(lstr); if((hexdata == 16) || (lowhexdata == 16)) break; else hexdata = hexdata*16+lowhexdata; i++; senddata[hexdatalen] = (char)hexdata; hexdatalen++; } senddata.resize(hexdatalen); } char MainWindow::ConvertHexChar(char ch) { if((ch >= '0') && (ch <= '9')) return ch-0x30; else if((ch >= 'A') && (ch <= 'F')) return ch-'A'+10; else if((ch >= 'a') && (ch <= 'f')) return ch-'a'+10; else return ch-ch;//不在0-f范围内的会发送成0 }同样的,也可以用类似的方法,将4个字节转化为对应的float数据
float MainWindow::qByteArraytofloat(QString qstr) { QByteArray byte; StringToHex(qstr,byte); float result; memcpy(&result, byte.data(), 4); return result; }调用实例如下:
QString longitude = list[4];//"d0e1219827610040" double longitude_rad = qByteArraytodouble(longitude);//2.04744 double longitude_deg = 180 * longitude_rad /M_PI; longitude = QString::number(longitude_deg,10,8) + " deg"; ui->label_longitude->setText(longitude); QString altitude = list[5];//"55fc6a40" float altitude_m = qByteArraytofloat(altitude);//3.67165 altitude = QString::number(altitude_m,10,8) + " deg"; ui->label_altitude->setText(altitude);