将十六进制值转换为纬度/经度

逆向工程 十六进制
2021-07-07 10:20:13

对不起,如果这是问这个错误的地方,但我很难过。我正在查看 iOS 代码,如下所示。

- (NSString *)currentE6Location {
    CLLocationCoordinate2D loc = [AppDelegate instance].mapView.centerCoordinate;
    return [NSString stringWithFormat:@"%08x,%08x", (int)(loc.latitude*1E6), (int)(loc.longitude*1E6)];
}

所以这很简单..根据我的理解,他们正在采用纬度/经度并将其从浮点数更改为整数,然后将整数转换为在前面填充为 0 的十六进制数。所以十六进制值的长度是 8 个字符。我遇到的问题是在 python 中做同样的事情..

所以 iOS 应用程序发送十六进制值,如

36.968772,-122.013498   "0234194f,f8ba38ae"

第一组是纬度/经度,第二组大致是它们的十六进制值

纬度工作得很好

0234194f = 36968783

所以 36968783 / 1e6 = 36.968783(就像我说的这是两者之间的粗略估计)

但第二个很奇怪

f8ba38ae = 4172953774

如果它是 lon 的 - 值,则似乎在那里使用 4,因为您不能让负 int 具有十六进制值。所以放弃 4

172953774 / 1e6 = 172.953774 (so knowing the 4 is there it would be -172.953774)

所以我有点困惑为什么它适用于 lat 而不是 lon..

再次抱歉,如果这是错误的网站,请关闭。

1个回答

我不确定这是不是正确的地方——StackOverflow 本来是一个很好的提问的地方——但我还是会回答。本质上,问题在于%x将参数视为无符号整数。所以该值f8ba38ae是原始有符号整数的二进制补码表示。

不过,您可以轻松地将其转换回来,例如使用以下 Python 代码段:

>>> import struct
>>> struct.unpack('>i', 'f8ba38ae'.decode('hex'))[0]
-122013522