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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM