[Talk-de] unbekanntes Datenformat aus GPS-Logger

bkmap burkhard.kirchner at web.de
So Jun 10 19:06:15 UTC 2012


Am 10.06.2012 10:33, schrieb Paul Hartmann:
> Hm, als zusätzliche Schikane scheint der Offset für jede Datei
> verschieden zu sein (vergleiche erste Mail). Naheliegenderweise müsste
> der Wert im Header kodiert sein:
>
> 559683543 =>  57
> 545946117 =>  40
>
> Was haben sich die Hersteller hier nur wieder einfallen lassen, um
> sicherzustellen, dass der Käufer auch brav die mitgelieferte Software
> nutzt?

Das hat nur wirklich Sinn, wenn man dafür extra Kohle verlangt und auch 
das ist noch fraglich.

Dieser Variante hier ist die Größe des Offsets egal. Ich gehe davon aus, 
dass das drittletzte Zeichen vor dem '\n' immer ein '*' ist:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * convert_line(char * s, int offset) {
	int i;
	int n = strlen(s);
	for (i=0; i<n; i++) {
		s[i] = (s[i] + offset) & 0xff;
	}
	return strchr(s,'$');
}

int main(int argc, char *argv[]) {
	int line_buf_len = 1024;
	char * line_buf = malloc(line_buf_len);
	if (NULL==line_buf) {
		printf("can't allocate memory\n");
		exit(1);
	}
	if (argc != 2) {
		printf("usage: %s filename\n", argv[0]);
		exit(1);
	} else {
		FILE *file = fopen(argv[1], "r");
		if (file == NULL) {
			printf("Could not open file\n");
			exit(1);
		} else {
			int a = 0; /* erste Zeile */
			int offset = 0;
			char * p_nmea=NULL;
			while (NULL!=fgets(line_buf, line_buf_len, file)) {
				int l = strlen(line_buf);
				line_buf[l-1]=0;
				if (a){ // erst ab 2. Zeile
					if (1==a) { // nur in 2. Zeile
						offset = '*'-line_buf[l-4]; // das 3t-letzte Zeichen sollte ein 
'*' sein.
					}
					p_nmea = convert_line(line_buf, offset);
					if (p_nmea) {
						printf("%s\n", p_nmea);
					}
				}
				a++;
			}
			fclose(file);
		}
	}
	free(line_buf);
	return 0;
}

Viele Grüße
Burkhard






Mehr Informationen über die Mailingliste Talk-de