Ответ 1
Он просто слишком большой для int (который составляет 4 байта и подписан).
Используйте
Long.parseLong("AA0F245C", 16);
Я пытаюсь преобразовать строку с шестнадцатеричным кодом длиной 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.
Благодарим вас за помощь.
Он просто слишком большой для 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 с параметром формата.
Integer.parseInt("-FF", 16) ; // returns -255
Правильный ответ:
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, не поместится в Integer, если он представлен как положительное число (дает 4294967295). Так что вам нужно долго хранить его. После преобразования в отрицательное число и приведения обратно к целому числу оно будет соответствовать. Нет шестнадцатеричной строки из 8 символов, которая в конце не поместится в целое число.
//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);
Дополнительным вариантом к предлагаемым является использование класса BigInteger
. Поскольку шестнадцатеричные значения часто являются большими числами, такими как значения sha256 или sha512, они легко переполняют int
и long
. Хотя преобразование в байтовый массив является опцией, как показывают другие ответы, BigInterger
, часто забываемый класс в Java, также является опцией.
String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266