c++ 根据IEEE754标准实现导航BESTPOS语句经纬度十六进制至ASCII转换方法
最近配置华为的MDC300F,发现其GPS数据传输没办法传导航配置好的ASCII格式消息,只能传输二进制的日志格式消息。又没有其他途径。只能自己写代码转换了。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cmath>
using namespace std;
double compute(unsigned* lat_byte)
{
int E = (((lat_byte[7] << 8) + (lat_byte[6] & 0xf0)) >> 4);
uint64_t lat7 = lat_byte[7];
uint64_t lat6 = lat_byte[6];
uint64_t lat5 = lat_byte[5];
uint64_t lat4 = lat_byte[4];
uint64_t lat3 = lat_byte[3];
uint64_t lat2 = lat_byte[2];
uint64_t lat1 = lat_byte[1];
uint64_t lat0 = lat_byte[0];
uint64_t M = (1ULL << 52) + ((lat6 << 24 << 24) + (lat5 << 24 << 16) + (lat4 << 16 << 16) + (lat3 << 24) + (lat2 << 16) + (lat1 << 8) + lat0 & 0x0fffffffffffff);
double lat = M * pow(2, E - 1075);
return lat;
}
int main()
{
unsigned lat_byte[8] = { 0x14,0x1e,0x8c,0x08,0x1b,0xd1,0x3d,0x40 };
double jingdu = compute(lat_byte);
printf("%.15f \n", jingdu);
unsigned lon_byte[8] = { 0x56,0xd9,0x17,0x6d,0x74,0x9a,0x5a,0x40 };
double weidu = compute(lon_byte);
printf("%.15f \n", weidu);
system("pause");
return 0;
}
从导航导出的日志信息中提取代表分别代表经纬度的16进制日志信息lat_byte和lon_byte进行计算 原理如连接所示:https://wenku.baidu.com/view/e49886f31611cc7931b765ce0508763230127449.html
转换结果如上图 导航直接导出的经纬度如上。在地图上对比后相差不大,应该能用
|