从dashcam .MOV文件中将十六进制转换为纬度经度

Rio*_*los 5 gps hex latitude-longitude

我有一个OEM dashcam,以.MOV格式保存视频.我想以编程方式从视频文件中提取嵌入的gps数据.在十六进制编辑器中打开.mov文件后,我发现带有freeGPS标题的数据包,我可以确认,对于我的7秒样本视频,有7个数据包,所以我知道gps数据的来源.

我已经找到了日期和时间,但我仍然坚持将十六进制值转换为纬度经度.下面是使用Registrator Viewer提取时的十六进制值及其等效坐标.

273108AC1C7996 404E,0D022B873EA3C7 4045 - 14.637967,121.041475 516B9A771C7996 404E,0D022B873EA3C7 4045 - 14.637963,121.041475 B9FC87F41B7996 404E,52499D803EA3C7 4045 - 14.637955,121.041472 B9FC87F41B7996 404E,52499D803EA3C7 4045 - 14.637955,121.041472 B459F5B91A7996 404E,C442AD693EA3C7 4045 - 14.637935,121.041460 1DEBE2361A7996 404E,ACADD85F3EA3C7 4045 - 14.637927,121.041455 08CE19511A7996 404E,4FD1915C3EA3C7 4045 - 14.637928,121.041453

粗体字节直接转换为@N和@E,所以我认为它们不是转换的一部分.我已经尝试了以下答案,但我没有成功获得正确的坐标.

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

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

我已经向dashcam提供商发送了一封电子邮件,询问他们的协议文档,但是当我要求他们自己的视频播放器时,他们发送了Registrator Viewer,看起来他们看起来并不像.

我还将包括第一个freeGPS数据包,以防我看错了地方.

00 00 80 00 66 72 65 65 47 50 53 20 98 00 00 00 78 2E 78 78 00 00 00 00 00 00 00 00 00 00 00 00 30 30 30 30 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 03 00 00 00 27 00 00 00 41 00 00 00 27 31 08 AC 1C 79 96 40 4E 00 00 00 00 00 00 00 0D 02 2B 87 3E A3 C7 40 45 00 00 00 00 00 00 00 8F C2 F5 28 5C 8F E2 3F 48 E1 7A 14 AE 07 68 40 11 00 00 00 06 00 00 00 14 00 00 00 76 00 00 00 88 00 00 00 DE 00 00 00 4D 00 00 00 49 00 00 00 4F 00 00 00 2D 00 00 00 2B 00 00 00 00 00 00 00

粗体数据按顺序提取:freeGPS,时间,纬度@ N ?,经度@ E ?,日期

我可以确认时间和日期是正确的.速度应该是1公里/小时,但我也找不到.

提前感谢那些可以提供帮助的人.

编辑:这是测试视频的链接.测试视频

cei*_*cat 5

不知道这有多大帮助,但是如果你将十六进制字符串(包括末尾的0x40)转换成一个小尾数IEEE-754双精度实数,那么你得到大约100倍的纬度/经度.

在C中,我做了类似的事情

printf( "%f\n", *(double*)"\x27\x31\x08\xAC\x1C\x79\x96\x40" );
printf( "%f\n", *(double*)"\x0D\x02\x2B\x87\x3E\xA3\xC7\x40" );
Run Code Online (Sandbox Code Playgroud)

然后下了车

1438.278000
12102.488500
Run Code Online (Sandbox Code Playgroud)

感谢@ TDG更新

如果将1438.278其解释为14度38.278分钟,那么您将获得十进制值14.6379666666666667.如果12102.4885被解释为121度和2.4885分钟,则十进制等值为121.041475.

一些示例C代码来执行此操作

#include<stdio.h>
double convert( double input ) {
  int i = input/100;
  return ( input - i*100 ) / 60 + i;
}
int main(){
  printf( "%f\n", convert( *(double*)"\x27\x31\x08\xAC\x1C\x79\x96\x40" ) );
  printf( "%f\n", convert( *(double*)"\x0D\x02\x2B\x87\x3E\xA3\xC7\x40" ) );
}
Run Code Online (Sandbox Code Playgroud)