2014-11-07 3 views
-1

У меня есть String, содержащий шестнадцатеричное число "dddddddd" и в настоящее время я использую метод int hex_to_int(String s), чтобы превратить его в int decimalValue:шестнадцатеричной в десятичную преобразование в Java

public static int hex_to_int(String s) 
    { 
     String digits = "ABCDEF"; 
     s = s.toUpperCase(); 
     int val = 0; 
     for (int i = 0; i < s.length(); i++) { 
      char c = s.charAt(i); 
      int d = digits.indexOf(c); 
      val = 16*val + d; 
     } 
     return val; 
    } 

когда я int decimalValue = hex_to_int("dddddddd"); это дает мне эту decimalValue -572662307 тогда шестнадцатеричной "dddddddd" должно быть 3722304989 в десятичной форме. Я также пробовал int decimalValue = Integer.parseInt("dddddddd",16); это дало мне NumberFormatException.

ответ

3

3722304989 больше максимального числа, которое может удерживаться переменной int. Вот почему вы получаете переполнение, и результат становится отрицательным. Вот почему Integer.parseInt("dddddddd",16) выдает исключение.

Если вы измените переменную val и возвращаемый тип метода на длинный, вы получите ожидаемый результат.

Вы также можете использовать Long.parseLong("dddddddd",16).

+0

Другое решение: 'новый BigDecimal (с, 16) .toIntExact()' ' – fge

+0

длинные Целочисленный Беззнаковый = 0xFFFF_FFFFL & hex_to_int (с);' –

+0

я Я использую кеш, и мой кеш представляет собой ** ArrayList **, содержащий тип массива типа int, и это значение «dddddddd» необходимо сохранить в одном из индексов. Что мне теперь делать? – Dingling

1

Вы попробовали?

System.out.println(Long.parseLong("dddddddd", 16)); 

Вы получаете исключение формат номера becouse это до большого значения для Integer после преобразования, попробуйте удалить один «D» и он должен работать с Integer.parseInt или разобрать на Long, как я показал выше.

1

Преобразование шестнадцатеричного значения для "dddddddd" превышает диапазон для диапазона значений Целочисленный, используемый в вашем примере. Ниже код дает правильное значение:

package StackOverflow;

импорт java.util. *;

общественного класса HexaToDecimal {

/** 
* @param args 
*/ 


public static void main(String[] args) 
{ 
    // TODO Auto-generated method stub 

    System.out.print("Provide Hexadecimal Input:"); 

    Scanner userInput = new Scanner(System.in); 

    String inputValue = userInput.nextLine(); 

    try 
    { 
     //actual conversion of hex to Decimal 

     Long outputDec = Long.parseLong(inputValue,16); 
     System.out.print("Decimal Equivalent : " +outputDec);  

    } 

    catch(NumberFormatException ne) 
    { 
     System.out.println("Invalid Input"); 
    } 
    finally 
    { 
     userInput.close(); 
    } 
} 

}

Смежные вопросы