1. 程式人生 > 其它 >QT筆記:QT 十六進位制經緯度資料轉IEEE-754浮點資料

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