hexString.toInt (32) NumberFormatException - PullRequest
0 голосов
/ 03 октября 2018

У меня есть 32-разрядное шестнадцатеричное значение, которое я хочу преобразовать в целое число.

Следующие методы оба предоставляют следующую ошибку, учитывая шестнадцатеричную строку C71C5E00:

java.lang.NumberFormatException: для входной строки: "C71C5E00"

"C71C5E00".toInt(32)
Integer.valueOf("C71C5E00", 32)

Kotlin docs заявляет, что Int представляет 32-разрядное целое число со знаком , так что это не значит, что значение слишком велико для упаковки в Int.Я напрасно пытался добавить 0x к строке.

РЕДАКТИРОВАТЬ: Согласно этот вопрос, который я пытался:

java.lang.Integer.parseInt("C71C5E00", 32)

К сожалению, я все еще получаю ту же ошибку.

Я не часто прикасаюсь к Android или Kotlin, так что прости мое невежество.

1 Ответ

0 голосов
/ 03 октября 2018

Во-первых, вы, кажется, неправильно поняли основание, которое является вторым аргументом в valueOf и parseInt, и единственным аргументом с функцией расширения toInt.Он не представляет биты в целевом числовом типе, он говорит методу, как преобразовать вашу строку.Обратите внимание, что есть вторая проблема, к которой я вернусь позже.

Radix - это базовый номер базовой системы счисления.По умолчанию это 10 (метод 0-arg toInt(). toInt() вызывает parseInt, который выглядит так:

public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s,10);
}

Как видите, он использует radix = 10. Опять же, битытипа числа здесь не имеет значения. Википедия достаточно хорошо это охватывает, и Java более или менее следует той же системе. Как вы видите, 16 соответствует шестнадцатеричному. Поэтому подходящее основание для использования здесь - 16.

Однако у , как я уже упоминал, есть вторая проблема. Она все равно будет аварийно завершать работу, потому что значение не может быть проанализировано. Полученное число равно 3340525056, что больше, чеммаксимальное значение int, равное 2147483647.

Это означает, что вы не можете использовать ни один из методов int, вам нужно использовать Long.

Итак, для вашегослучай, это хорошо:

val x = "C71C5E00".toLong(16)

Опять же, основа - это система счисления, а не количество бит в результирующем числе. Если бы это было так, вам нужно было бы использовать 64 для длинных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...