Я пытаюсь преобразовать строку длиной 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.
Заранее благодарю за вашу помощь.
0xAA0F245C = 2853119068
ноInteger.MAX_VALUE = 0x7fffffff = 2147483647
Integer.parseUnsignedInt("value",radix)
метод, который служит вашей цели. Если значение больше, чемInteger.MAX_VALUE
оно отображается в отрицательное число.Ответы:
Он просто слишком велик для int (4 байта со знаком).
Использовать
источник
NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"
... Решение?BigInteger
класса:BigInteger value = new BigInteger(valueString, 16)
вы можете использовать так
источник
Максимальное значение, которое
Integer
может обработать Java, - 2147483657 или 2 ^ 31-1. Шестнадцатеричное число AA0F245C - 2853119068 как десятичное число, и оно слишком велико, поэтому вам нужно использоватьчтобы заставить его работать.
источник
вы можете легко сделать это с помощью parseInt с параметром формата.
javadoc Integer
источник
Это правильный ответ:
myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)
источник
Для тех из вас, кому нужно преобразовать шестнадцатеричное представление байта со знаком из двухсимвольной строки в байт (который в Java всегда подписан), есть пример. Анализ шестнадцатеричной строки никогда не дает отрицательного числа, что неверно, потому что 0xFF - это -1 с некоторой точки зрения (кодирование с дополнением до двух). Принцип состоит в том, чтобы проанализировать входящую строку как int, которая больше байта, а затем обернуть отрицательные числа. Я показываю только байты, так что этот пример достаточно короткий.
Его можно отредактировать для обработки более длинных номеров. Просто добавьте больше FF или 00 соответственно. Для разбора 8 шестнадцатеричных целых чисел со знаком вам необходимо использовать Long.parseLong, потому что FFFF-FFFF, который является целым числом -1, не вписывается в Integer, когда он представлен как положительное число (дает 4294967295). Значит нужно долго хранить. После преобразования в отрицательное число и возврата к целому, оно подойдет. Не существует восьмизначной шестнадцатеричной строки, которая не помещалась бы в конце целого числа.
источник
Дополнительным вариантом к предложенным является использование
BigInteger
класса. Поскольку шестнадцатеричные значения часто представляют собой большие числа, такие как значения sha256 или sha512, они легко переполнят anint
и along
. Хотя преобразование в байтовый массив - это вариант, как показывают другие ответыBigInterger
, часто забываемый класс в java также является вариантом.источник
источник
Попробуйте с этим:
длинный abc = convertString2Hex («1A2A3B»);
источник