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