已知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