前段时间,在编写一个GPS对时上位机时遇到了这个问题:十六进制经纬数据转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
所有原创文章采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
除特别注明,您可以自由的转载和修改,但请务必注明文章来源且不可用于商业目的。