2013-06-28 13 views
5

Próbuję konwertować dane GPS z urządzenia śledzącego GPS. Firma przedstawiła podręcznik protokołu, ale nie jest to jasne. Większość danych udało mi się zdekodować z pakietów, które otrzymałem z urządzenia. Komunikacja odbywa się za pośrednictwem protokołu TCP/IP. Mam problem z dekodowaniem wartości szesnastkowej długości i szerokości geograficznej. Oto przykład z podręcznika:Jak przekonwertować długość i szerokość geograficzną GPS z heksadecymatu

przykład: 22º32.7658' = (22X60 + 32,7658) X3000 = 40582974, a następnie przekształcany w szesnastkowym 40582974 (dziesiętnie) = 26B3F3E (szesnastkowo) wreszcie wartość jest 0x02 0x6B 0x3F 0x3E.

Chciałbym wiedzieć, jak odwrócić od szesnastkowej do długości i szerokości geograficznej. Urządzenie wyśle ​​26B3F3E. Chcę poznać proces uzyskiwania 22º32.7658.

Protokół ten dotyczy GT06 i Heacent 908.

+0

możliwy duplikat [Konwersja tylnych szerokości geograficznych z Hex danych GREENTEL] (http://stackoverflow.com/questions/7151896/convert-back-latitude-from-hex-data-greentel) – wallyk

+0

niewiarygodne, który idiota wymyślił tę reprezentację. dziesiętne stopnie * 1e6 dostarcza wartość int, wartość ta jest następnie łatwa do zakodowania i dekodowania. po prostu podziel przez 1e6, aby ponownie uzyskać dziesiętne stopnie. – AlexWien

Odpowiedz

2
  1. przechowywać wszystkie cztery wartości w niepodpisane zmiennych 32-bitowych.
    v1 = 0x02, v2 = 0x6b, v3 = 0x3f, v4 = 0x3e.

  2. Obliczyć (v4 << 48) | (v3 << 32) | (v2 << 16) | v1 przyniesie to zmienną o wartości 40582974 po przecinku.

  3. przekonwertować to do pływaka i podzielić ją przez 30,000.0 (twój 3000 był błąd), to daje 1,352.765

  4. Chop na całkowitą i podzielić przez 60. To daje 22.

  5. Pomnóż liczbę uzyskaną w punkcie 4 przez 60 i odejmij ją od liczby uzyskanej w kroku 3. Otrzymasz 1352.765 - 22*60 lub 32,765.

Jest odpowiedź 22, 32.765.

+0

Dzięki za odpowiedź. Spróbuję tego w moim kodzie. Zaktualizuję później. jeszcze raz dzięki za szybką odpowiedź – Adeed

+2

David, poszedłem za twoją sugestią i to działa. Znowu dziękuję za pomoc – Adeed

+0

Wartości 'vX' są bajtami, a nie 16-bitowymi wartościami i było błędne dodatkowe' | '. Kod powinien mieć postać '(v4 << 24) | (v3 << 16) | (v2 << 8) | v1'. – wallyk

Powiązane problemy