2013-06-28 7 views
5

Ich versuche GPS-Daten von GPS-Tracking-Gerät zu konvertieren. Das Unternehmen hat Protokollhandbuch zur Verfügung gestellt, aber es ist nicht klar. Die meisten Daten konnte ich aus den Paketen, die ich vom Gerät erhalten habe, entschlüsseln. Die Kommunikation erfolgt über TCP/IP. Ich habe ein Problem beim Decodieren des Hexadezimalwerts der Länge und Breite. Hier ist ein Beispiel aus dem Handbuch:Wie konvertiert man GPS Länge und Breite von hex

Beispiel: 22º32.7658' = (22X60 + 32,7658) X3000 = 40.582.974, dann umgewandelt in eine Hexadezimalzahl 40.582.974 (dezimal) = 26B3F3E (hexadezimal) schließlich der Wert 0x02 0x6B 0x3F 0x3E.

Ich möchte wissen, wie man von der hexadezimalen zu Längen- und Breitengrad umkehrt. Das Gerät sendet 26B3F3E. Ich möchte wissen, wie ich 22º32,7658 bekomme.

Dieses Protokoll gilt für GT06 und Heacent 908.

+0

möglich Duplikat von [Konvertieren zurück Breitengrad aus Hexendaten GREENTEL] (http://stackoverflow.com/questions/7151896/convert-back-latitude-from-hex-data-greentel) – wallyk

+0

Ungläubig welcher Idiot diese Darstellung erfand. Dezimalgrade * 1e6 liefert einen int-Wert, dieser Wert ist dann einfach zu codieren und zu decodieren. Teilen Sie einfach durch 1e6, um wieder Dezimalgrade zu erhalten. – AlexWien

Antwort

2
  1. Shop alle vier Werte in unsigned 32-Bit-Variablen.
    v1 = 0x02, v2 = 0x6b, v3 = 0x3f, v4 = 0x3e.

  2. Berechnen (v4 << 48) | (v3 << 32) | (v2 << 16) | v1 Dies ergibt eine Variable mit dem Wert 40582974 dezimal.

  3. diese Umwandlung in einem Schwimmer und teilen sie durch 30,000.0 (Ihre 3000 war ein Fehler), das Sie 1,352.765 geben

  4. Chop integer und dividieren durch 60. Dies gibt Ihnen die 22.

  5. Multiplizieren Sie die Zahl, die Sie in Schritt 4 erhalten haben, mit 60 und subtrahieren Sie sie von der Nummer, die Sie in Schritt 3 erhalten haben. Dadurch erhalten Sie 1352.765 - 22*60 oder 32.765.

Es ist Ihre Antwort 22, 32.765.

+0

Danke für die Antwort. Ich werde es in meinem Code versuchen. Ich werde dich später aktualisieren. nochmals vielen Dank für die schnelle Antwort – Adeed

+2

David, ich folgte deinem Vorschlag und es funktioniert. Nochmals vielen Dank für Ihre Hilfe – Adeed

+0

Die 'vX' Werte sind Bytes, keine 16-Bit Werte, und es gab ein falsches extra' | '. Der Code sollte '(v4 << 24) | sein (v3 << 16) | (v2 << 8) | v1'. – wallyk

Verwandte Themen