请问我能帮助我找出从8字节值计算纬度和经度的算法吗?
8字节值 - A027AFDF5D984840 ,经度 49.1903648
8字节值 - 3AC7253383DD4B40 且纬度 55.7305664
如果可能,请告诉我如何计算 0000000000805A40 的浮点值 106.0
答案 0 :(得分:0)
这不是经度和纬度计算特有的。假设您的示例中有8个字节可供使用,那么您要做的是将字节数组转换为双精度浮点值。所有三个例子的过程都是一样的。
要查找浮点值,需要在位级处理字节数组。该过程的解释是here。或者查看Wikipedia。
为了让您入门,在您的第一个示例中,您将按40,48,98,5D等顺序处理字节。分解前两个字节40和48(0100 0000 0100 1000),您有足够的信息来获得符号位(0)和指数位范围(100 0000 0100 - > 1028)。从这里开始,继续列出剩余的52个位以确定该数字的小数部分。如果您按照上面链接中的计算进行操作,您将看到您希望从示例中获得的浮点值。
作为旁注,一些编程语言提供了一种为您执行此转换的方法。根据您使用的语言,不需要在这里重新发明轮子。
编辑:示例
要将字节数组转换为双精度浮点值,我们需要来自字节数组的三条信息:符号位(S),指数(E) 和分数(F)。首先要做的是创建8字节数组的64位表示。如上所述,您将以“反向”顺序使用字节(如果您想要阅读该主题,请使用little-endian)。我将仅使用前四个字节,因为它们足以说明该过程。
40 48 98 5D ==> 01000000 01001000 10011000 01011101
我将以0为最左边的顺序引用上面的位。
签名位 这是上面数组中的第0位。在这种情况下, S 为0.符号位正是您认为的那样,它确定浮点结果是负还是正。
<强>指数:强> 位1-11确定指数。在该示例中,指数 E 是100 0000 0100 ==&gt; 1028。
<强>分数:强> 剩下的比特,12-63确定分数。我只是说明了第12-31位,以显示该过程的工作原理:1000 10011000 01011101 ....
小数位不会转换为小数值。相反,你需要迭代它们,注意设置的位(1,而不是0)。位的索引在这里很重要。考虑从1开始从1开始增加到20的索引分数位。再次,在完整示例中(位12-63),此索引将为1到52.
通过将使用该表达式设置的每个第i位求和来找到分数:2 ^ -i。对于这个例子,这意味着我们正在处理索引1,5,8,9,14,16,17,18,20。
前四个索引将为示例提供足够的精度:
F =(2 ^ -1)+(2 ^ -5)+(2 ^ -8)+(2 ^ -9)+ ... = 0.5 + 0.03125 + 0.00390625 + 0.001953125 = 0.537109375
通过应用以下公式找到最终值 V :
V = -1 ^ S * 2 ^(E-1023)*(1 + F)= -1 ^ 0 + 2 ^(1028-1023)* 1.537109375 = 49.1875
这是您的目标值49.1903648的良好近似值。如果您按照我向您展示的方式继续使用完整的小数位范围,那么您的最终值将匹配。
最后,既然您提到使用的是Java,那么您是否考虑过使用ByteBuffer
类和getDouble
函数here?