QT笔记:QT 十六进制经纬度数据转IEEE-754浮点数据
已知GPS数据:
经纬度格式:ddd.ddddd°(度),小数部分5位,报文中用16进制单精度float表示:
经度119.32132 用单精度float表示 42 EE A4 84 纬度39.46712 用单精度float表示 42 1D DE 55
原理不想展开,网上已搜一大堆,重点都在代码里:
QString Widget::claculate_Data(QByteArray array) { bool ok; int sign = 1; //QByteArray array("425AE78F"); 输入QByteArray = 42 5A E7 8F; array = QByteArray::number(array.toLongLong(&ok,16),2); //将十六进制数据转换为二进制 if(array.length()==32) { if(array.at(0)=='1') sign =-1; // 如果第0位为1 ,则表示该数为负数; array.remove(0,1); // 移除标志位 } QByteArray fraction =array.right(23); //获取小数部分; double mantissa = 0; for(int i=0;i<fraction.length();i++) // 迭代数组,以小数形式计算分数 if(fraction.at(i)=='1') mantissa += 1.0/(pow(2,i+1)); int exponent = array.left(array.length()-23).toLongLong(&ok,2)-127; //计算指数位; calcu_Data = QString::number( sign*pow(2,exponent)*(mantissa+1.0),'f', 5 ); qDebug() << "number= "<< QString::number( sign*pow(2,exponent)*(mantissa+1.0),'f', 5 ); // 输出单精度浮点数据 number = 54.72613 return calcu_Data; }
转自:https://codess.cc/archives/370.html