4

I am receiving data from a gps unit via a udp packet. Lat/Lng values are in hex.

Example Data
13BF71A8 = Latitude (33.1313576)
BA18A506 = Longitude (-117.2790010)

The documentation explains that longitude/latitude readings are measured in degrees with a 1x10^-7 degree lsb, signed 2’s complement.

For the Latitude I can convert using this formula:
13BF71A8 = 331313576 * 0.0000001 = 33.1313576

This code works for Lat but not for Lng:

function convertLat(h){
var latdec = parseInt(h,16);
    var lat = latdec * 0.0000001;
    return lat;
}

console.log("LAT: " + convertLat("13BF71A8"));

I am having trouble converting the Longitude value. Does anyone know how to convert the Longitude?

brady321
  • 1,475
  • 13
  • 14

3 Answers3

5

Because you are using signed numbers, you need to specify a point at which the hexadecimal code should flip to the bottom. This will be happening at 7FFFFFFF and up. Now update your code to check if the input is greater than this number, and if so, subtract it from the input.

function convert(h) {
    dec = parseInt(h, 16);
    return (dec < parseInt('7FFFFFFF', 16)) ?
        dec * 0.0000001 :
        0 - ((parseInt('FFFFFFFF', 16) - dec) * 0.0000001);
}

The only reason your example worked is because the output was expected to be positive.


As AlexWien mentioned in the comments: Since parsing 7FFFFFFF and FFFFFFFF are giving the same integers every time, you could store them as constants. Their values are 2147483647 and 4294967295 respectively.

Broxzier
  • 2,909
  • 17
  • 36
  • 1
    This answer was close and it got me on the right track. Here is the code I eventually got working for both lat and lng. `function(h){ dec = parseInt(h,16); return (dec < parseInt('7FFFFFFF', 16)) ? dec * 0.0000001 : 0 - ((parseInt('FFFFFFFF', 16) - dec) * 0.0000001); }` – brady321 Oct 16 '13 at 20:40
  • 1
    by the way, you could avoid the parseint of FFFF... and 7Fffff by storing them as constants. – AlexWien Oct 17 '13 at 11:11
  • @AlexWien Very true, I added it to my answer. – Broxzier Oct 17 '13 at 12:00
1

Lat and Long use the same algorithm for conversion. Your latitude accidentaly wokred because it is positive (33.13)

The test Longitude is negative, which makes the error in the conversion algorithm visible, as usually with negative numbers.

AlexWien
  • 28,470
  • 6
  • 53
  • 83
0

use this for 2 compliment

private static Decimal ParseHexStringToDouble(string hexNumber) {
    long result = 0;
    result = int.Parse(hexNumber, System.Globalization.NumberStyles.HexNumber);
    return result;
}
Prasad Khode
  • 6,602
  • 11
  • 44
  • 59