gpt4 book ai didi

binary - 如何将我的二进制(十六进制)数据转换为纬度和经度?

转载 作者:行者123 更新时间:2023-12-04 20:55:36 27 4
gpt4 key购买 nike

我有一些传递地理位置坐标的二进制数据流 - 纬度和经度。我需要找到它们编码的方法。

4adac812 = 74°26.2851' = 74.438085
2b6059f9 = 43°0.2763' = 43.004605

4adaee12 = 74°26.3003' = 74.438338
2a3c8df9 = 42°56.3177' = 42.938628

4ae86d11 = 74°40.1463' = 74.669105
2afd0efb = 42°59.6263' = 42.993772

第一个值是十六进制值。第 2 和第 3 是我在输出中得到的值(不确定在转换中使用了哪一个)。

我发现第一个字节代表值的整数部分(0x4a = 74)。但我找不到小数部分是如何编码的。

我真的很感激任何帮助!

谢谢。

--

Upd:这个流来自一些通过 tcp 协议(protocol)的“中国”gps 服务器软件。我没有 clent 软件的资源或文档。我想它是用 VC++6 编写的,并使用了一些标准实现。

--

更新:这是我得到的数据包:
Hex data:
41 00 00 00 13 bd b2 2c
4a e8 6d 11 2a 3c 8d f9
f6 0c ee 13

Log data in client soft:
[Lng] 74°40.1463', direction:1
[Lat] 42°56.3177', direction:1
[Head] direction:1006, speed:3318, AVA:1
[Time] 2011-02-25 19:52:19

Result data in client (UI):
74.669105
42.938628
Head 100 // floor(1006/10)
Speed 61.1 // floor(3318/54.3)


41 00 00 00 b1 bc b2 2c
4a da ee 12 2b 60 59 f9
00 00 bc 11
[Lng] 74°26.3003', direction:1
[Lat] 43°0.2763', direction:1
[Head] direction:444, speed:0, AVA:1
[Time] 2011-02-25 19:50:49
74.438338
43.004605


00 00 00 00 21 bd b2 2c
4a da c8 12 aa fd 0e fb
0d 0b e1 1d
[Lng] 74°26.2851', direction:1
[Lat] 42°59.6263', direction:1
[Head] direction:3553, speed:2829, AVA:1
[Time] 2011-02-25 19:52:33
74.438085
42.993772

我不知道前 4 个字节是什么意思。

我发现第 5 个字节的低 7 位代表秒数。 (也许 5-8 位是时间?)
字节 9 表示 Lat 的整数。

字节 13 是 Lng 的整数。

字节 17-18 反转(字字节)是速度。

反转的字节 19-20 是 ava(?) 和方向(4 + 12 位)。 (顺便说一句,有人知道 ava 是什么吗?)

和一张纸条。在第 3 个数据包的第 13 个字节中,您可以看到仅使用了低 7 位。我猜第 1 位并不意味着 smth(我一开始就删除了它,如果我错了,请见谅)。

最佳答案

我已重新排序您的数据,以便我们首先有 3 个经度,然后有 3 个纬度:

74.438085、74.438338、74.669105、43.004605、42.938628、42.993772

这是我能想到的最适合的十六进制数是:

74.437368、74.439881、74.668392、42.993224、42.961388、42.982391

差异为:-0.000717、0.001543、-0.000713、-0.011381、0.022760、-0.011381

从完整的十六进制(4 个而不是 3 个字节)生成这些值的程序是:

int main(int argc, char** argv) {
int a[] = { 0x4adac812, 0x4adaee12, 0x4ae86d11, 0x2b6059f9, 0x2a3c8df9, 0x2afd0efb };
int i = 0;
while(i<3) {
double b = (double)a[i] / (2<<(3*8)) * 8.668993 -250.0197;
printf("%f\n",b);
i++;
}
while(i<6) {
double b = (double)a[i] / (2<<(3*8)) * 0.05586007 +41.78172;
printf("%f\n",b);
i++;
}
printf("press key");
getch();
}

关于binary - 如何将我的二进制(十六进制)数据转换为纬度和经度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5122383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com