【问题标题】:Convert unknown Hex digits to a Longitude and Latitude将未知的十六进制数字转换为经度和纬度
【发布时间】:2013-01-05 05:51:45
【问题描述】:
F3 c8 42 14 - latitude //05.13637° should be nearby this coordinate
5d a4 40 b2  - longitude //100.47629° should be nearby this coordinate

这是我从 GPS 设备获得的十六进制数据,如何转换为可读坐标? 我没有任何手动文档。请帮助。谢谢

    22 00 08 00 c3 80 00 20 00 dc f3 c8 42 14 5d a4 40 b2 74 5d 34 4e 52 30 39
47 30 35 31 36 34 00 00 00

这是我收到的完整字节,但工程师告诉我 F3 c8 42 14 是纬度,5d a4 40 b2 是经度

【问题讨论】:

  • 我已经编辑了标题并添加了一些其他标签以吸引更广泛的受众,因为你会更好地吸引更多的眼球。特别是,C 标签应该让您获得许多核心专家,其中一位可能有获胜的想法。
  • 我会因为这个而失眠。 @Anthor,您能给我们提供 GPS 模块的型号或其他信息吗?
  • This answer to a similar question 似乎使用的不仅仅是位置的十六进制编码......但我不明白他是如何得出他的常数的。
  • @Khanal:这是中国的 GPS 设备,所以没有型号。

标签: c binary hex coordinates latitude-longitude


【解决方案1】:

我曾经使用过摩托罗拉 GPS 模块,文档说这两个十六进制表示 int 类型。

在您的情况下,您可能还想查看文档。如果你知道型号,你可以谷歌它。 这是我使用的摩托罗拉 GPS 的文档链接。

Motorola GPS Module

我还冒昧地为你做了一些计算。如果你的纬度确实是

0x1442c8f3 

(字节序在这里确实有所作为)。整数等价物是

339921139 

十进制。如果你除以 3600000 毫秒 (其中 1 度 = 60 分钟 = 60 * 60 秒 = 60*60*1000 毫秒)你会得到 ​​p>

94.4225386

deg,接近您的预期。没有足够的数据来验证它,但我相信大多数 GPS 模块都会返回纬度和经度的毫秒数。)

【讨论】:

  • 很好的观察! (这些可能是固定点)。但是,您的中间结果似乎不正确?根据我的计算,0x1442c8f3 是 339921139(以 10 为底)。此外,3,600,000 毫秒为 60*60*1000。
  • 纬度方法似乎不适用于经度。假设小端表示,我们得到 0xb240a45d。如果这是一个 signed 长,那么这将是负数。但是由于位置是E,它应该是+。所以现在假设这实际上是一个 unsigned 长整数,我们得到的整数值为 2990580829。再除以 3,600,000 得到 830.71,与预期稍有差距。
  • 对不起,我将不得不编辑它。你是对的 339921139 base 10 是我得到的。我仍然习惯这种双显示器装备,我复制并粘贴了错误的数字。我现在会修复它。我确实通过 60*60*1000 获得了 3600000,但是由于我非常接近预期的结果,所以有点过度兴奋并且搞砸了。 :)
  • 别担心——定点观察也让我很兴奋。但是看看第二条评论。不确定相同的方法是否适用于经度...
  • 94.4225386 如何接近 5.13637 度?此外,您的纬度不能超过 90 度。
【解决方案2】:

假设十六进制代码表示未加密的 32 位浮点数(它们可能不这样做),您可以尝试将它们读入 C 程序并使用 printf("%f") 打印出来。

不要忘记单词可以同时具有字节序,即第一个可以是F3 C8 42 1414 42 C8 F3(字节反转)。

尝试两种方式,看看是否有任何有用的东西。

我无法从this online floating point calculator here 快速获得任何信息。


编辑:

以 Khanal 的回答为基础,指向 Latitude/Longitude 的链接表明这些数字确实是定点并解释了符号约定。

HexIt 可能对计算更有用,它允许从各种 C 数据类型中进行选择,包括整数和浮点数,以及在小端和大端表示之间来回切换。

【讨论】:

    【解决方案3】:

    我认为这些值是 32 位浮点数。但是,您显示的流中的字节略有偏移。先取经度:32 位浮点中的 100.47629 是 42C8F3DC 这些是流中的字节 10 到 13(最低有效字节在前)。 对于 32 位浮点中的纬度 5.13637 是 40A45D24,这些是字节 14 到 17,但它在字节流中是 40A45D14,所以它在最低有效十进制数字中稍微偏离了一点(同样,它是最低有效字节在前)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2010-11-11
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 2013-11-27
      相关资源
      最近更新 更多