Преобразование шестнадцатеричной строки в int

Я пытаюсь преобразовать строку с шестнадцатеричным кодом длиной 8 символов в целое число, чтобы я мог выполнять сравнение int вместо сравнения строк во множестве разных значений.

Я знаю, что это довольно тривиально в С++, но мне нужно сделать это на Java. Тестовый случай, который мне нужно выполнить, заключается в том, чтобы преобразовать "AA0F245C" в int, а затем обратно в эту строку, чтобы я знал, что он правильно конвертируется.

Я пробовал следующее:

int decode = Integer.decode("0xAA0F245C");  // NumberFormatException
int decode2 = Integer.decode("AA0F245C"); //NumberFormatException
int parseInt = Integer.parseInt("AA0F245C", 16); //NumberFormatException
int valueOf = Integer.valueOf("AA0F245C", 16); //NumberFormatException

Я также пробовал делать это по два символа за раз и умножая результаты, которые выполняет преобразование, но число неверно.

int id = 0;
for (int h = 0; h < hex.length(); h= h+2)
{
    String sub = hex.subSequence(h, h+2).toString();

if (id == 0)
    id = Integer.valueOf(sub, 16);
else
    id *= Integer.valueOf(sub, 16);             
 }
//ID = 8445600 which = 80DEA0 if I convert it back. 

Я не могу использовать сторонние библиотеки, чтобы вы знали, так что это должно быть сделано в стандартных библиотеках Java.

Благодарим вас за помощь.

Ответ 1

Он просто слишком большой для int (который составляет 4 байта и подписан).

Используйте

Long.parseLong("AA0F245C", 16);

Ответ 2

вы можете так использовать

System.out.println(Integer.decode("0x4d2"))    // output 1234
//and vice versa 
System.out.println(Integer.toHexString(1234); //  output is 4d2);

Ответ 3

Максимальное значение, которое может обрабатывать Java Integer, равно 2147483657 или 2 ^ 31-1. Шестнадцатеричное число AA0F245C равно 2853119068 как десятичное число и слишком велико, поэтому вам нужно использовать

Long.parseLong("AA0F245C", 16);

чтобы он работал.

Ответ 4

вы можете легко сделать это с помощью parseInt с параметром формата.

Integer.parseInt("-FF", 16) ; // returns -255

javadoc Integer

Ответ 5

Правильный ответ:

myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)

Ответ 6

Для тех из вас, кому необходимо преобразовать шестнадцатеричное представление байта со знаком из двухсимвольной строки в байт (который в Java всегда подписан), есть пример. Разбор шестнадцатеричной строки никогда не дает отрицательного числа, что является ошибкой, потому что 0xFF с некоторой точки зрения - это -1 (кодирование с двумя дополнениями). Принцип состоит в том, чтобы проанализировать входящую строку как int, которая больше байта, а затем обернуть отрицательные числа. Я показываю только байты, поэтому этот пример достаточно короткий.

String inputTwoCharHex="FE"; //whatever your microcontroller data is

int i=Integer.parseInt(inputTwoCharHex,16);
//negative numbers is i now look like 128...255

// shortly i>=128
if (i>=Integer.parseInt("80",16)){

    //need to wrap-around negative numbers
    //we know that FF is 255 which is -1
    //and FE is 254 which is -2 and so on
    i=-1-Integer.parseInt("FF",16)+i;
    //shortly i=-256+i;
}
byte b=(byte)i;
//b is now surely between -128 and +127

Это может быть отредактировано, чтобы обработать более длинные числа. Просто добавьте больше FF или 00 соответственно. Для синтаксического анализа 8 шестнадцатеричных целых чисел со знаком вам необходимо использовать Long.parseLong, поскольку FFFF-FFFF, являющийся целым числом -1, не поместится в Integer, если он представлен как положительное число (дает 4294967295). Так что вам нужно долго хранить его. После преобразования в отрицательное число и приведения обратно к целому числу оно будет соответствовать. Нет шестнадцатеричной строки из 8 символов, которая в конце не поместится в целое число.

Ответ 7

//Method for Smaller Number Range:
Integer.parseInt("abc",16);

//Method for Bigger Number Range.
Long.parseLong("abc",16);

//Method for Biggest Number Range.
new BigInteger("abc",16);

Ответ 8

Дополнительным вариантом к предлагаемым является использование класса BigInteger. Поскольку шестнадцатеричные значения часто являются большими числами, такими как значения sha256 или sha512, они легко переполняют int и long. Хотя преобразование в байтовый массив является опцией, как показывают другие ответы, BigInterger, часто забываемый класс в Java, также является опцией.

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266