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


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

Я знаю, что это довольно тривиально в C++, но мне нужно сделать это в 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 стандартные библиотеки.

Спасибо за вашу помощь заранее.

6 89

6 ответов:

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

использовать

Long.parseLong("AA0F245C", 16);

вы можете использовать подобное

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

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

Long.parseLong("AA0F245C", 16);

чтобы заставить его работать.

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

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

javadoc Integer

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

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

для тех из вас, кому нужно преобразовать шестнадцатеричное представление подписанного байта из двухсимвольной строки в байт (который в 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, не вписывается в целое число при представлении в виде положительного числа (дает 4294967295). Поэтому вам нужно долго хранить его. После преобразования в отрицательное число и приведения обратно к целому числу, он будет соответствовать. Нет 8-символьной шестнадцатеричной строки, которая не вписывалась бы в целое число конец.