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



_______________________________________________
Talk-de mailing list
[email protected]
http://lists.openstreetmap.org/listinfo/talk-de

Antwort per Email an