2016-08-17 2 views
1

я получил значения широты и долготы в шестнадцатеричном:Преобразование шестиугольника в десятичный (Lat/Lon)?

0AF6CF83 
D89B2933 

преобразуя их в десятичную я получил ...

183947139 
-660920013 

Проблема заключается в том, как получить эти десятичные в следующем формате с использованием Java ?

18.3947139 
-66.0920013 

Это, как я на самом деле преобразования Hex в десятичном:

public static int hex2Decimal(String s) { 
    long longValue = Long.parseLong(s, 16); 
    int intValue = (int)longValue; 
    return intValue; 
} 

ответ

3

Вы должны сначала разобрать шестнадцатеричное значение на int, затем умножить на 1e-7 (быстрее умножить на 1e-7, что деление на 1e7) разделяй что 1e7.
      Благодаря @RolandIllig за pointing out точность вопроса.

Однако Integer.parseInt() не разрешает разбор шестнадцатеричного шестнадцатеричного значения отрицательному целочисленному значению, то есть когда высокий бит включен.

В Java 8, вы могли бы сделать это:

public static double hex2Decimal(String s) { 
    return Integer.parseUnsignedInt(s, 16)/1e7; 
} 

Если ваш код должен работать на Java версиях до 8, сделайте следующее:

public static double hex2Decimal(String s) { 
    return (int)Long.parseLong(s, 16)/1e7; 
} 

Тест

System.out.println(hex2Decimal("0AF6CF83")); 
System.out.println(hex2Decimal("D89B2933")); 

Выход

18.3947139 
-66.0920013 
+0

Не умножайте с 1.0e-7, вместо этого разделите на 1.0e7. Это более точно. –

+0

@RolandIllig Значение 'int' имеет менее 10 цифр точности, поэтому результат этого вычисления может быть точным только до 9-10 цифр. 'double' имеет 15-17 цифр точности, поэтому любая неточность' 1e-7' бессмысленна. – Andreas

+2

Принято, но разделение имеет то преимущество, что вы можете просто использовать Double.toString и получить ожидаемый результат, вместо того, чтобы использовать формат, например '% .7f'. –

0

Первый номер выглядит очень легко: просто разделить int результат на 10.0e6, который составляет 10 миллионов.

+1

Подписанный int не может содержать 8 шестнадцатеричных цифр. – shmosel

+1

Концептуально это может, но 'parseInt' генерирует исключение, если оно переполняется. – shmosel

+1

Кстати, фактический результат 'hex2Decimal (" D89B2933 ")' is '-660920013'. – shmosel