如何将GPS经纬度从十六进制转换为十进制

9
我正在尝试将GPS跟踪设备的数据转换为可读格式。公司提供了协议手册,但并不清晰。我已经能够从接收到的数据包中解码出大部分数据。通信方式是TCP/IP。我现在遇到的问题是解码经度和纬度的十六进制值。以下是手册中的示例:
例如:22º32.7658’=(22X60+32.7658)X3000=40582974,然后转换为十六进制数 40582974(十进制)= 26B3F3E(十六进制) 最终的值是0x02 0x6B 0x3F 0x3E。
我想知道如何从十六进制反向得到经度和纬度。设备将发送26B3F3E。我想知道获取22º32.7658的过程。
此协议适用于GT06和Heacent 908。

可能是Convert Back Latitude from Hex data GREENTEL的重复问题。 - wallyk
真不敢相信,是哪个白痴发明了那种表示法。十进制度数 * 1e6 会得到一个整数值,这个值很容易编码和解码。只需除以 1e6 即可再次获得十进制度数。 - AlexWien
1个回答

9
  1. 将所有四个值存储在无符号32位变量中。
    v1 = 0x02v2 = 0x6bv3 = 0x3fv4 = 0x3e

  2. 计算(v4 << 48) | (v3 << 32) | (v2 << 16) | v1,这将得到一个包含40582974十进制值的变量。

  3. 将其转换为浮点数并除以30000.0(你的3000是错误的),这将给出1352.765。

  4. 截断为整数并除以60。这将给出22。

  5. 将步骤4中得到的数字乘以60并从步骤3中得到的数字中减去。这将给出1352.765 - 22*60或32.765。

这就是你的答案:2232.765


谢谢您的回复。我会在我的代码中尝试它。稍后我会更新您。再次感谢您的快速回复。 - Adeed
2
David,我按照你的建议做了,现在它可以正常工作了。再次感谢你的帮助。 - Adeed
vX 值是字节,而不是 16 位值,并且有一个错误的额外 |。代码应该是 (v4 << 24) | (v3 << 16) | (v2 << 8) | v1 - wallyk
@wallyk:它们是32位值。否则,在移位时会发生糟糕的事情。 - David Schwartz
如果这个解决方案不起作用,请参考这篇文章 - https://stackoverflow.com/questions/13543321/gps-tracker-received-data ... 在尝试了这种方法后,幸运的是我找到了另一篇文章,它对我很有用.. 希望这可以帮助其他人。 - NMathur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接