Хорошо, давайте перейдем к строке для строки
public static int getDecimal(String hex)
hex - это параметр, его необходимо объявить там, чтобы вы могли передавать строку при вызове функции.
String digits = "0123456789ABCDEF";
Да, это объявляет строку со всеми символами, которые могут встречаться в шестнадцатеричном числе.
hex = hex.toUpperCase();
Он преобразует буквы в шестнадцатеричной строке в верхний регистр, так что это всегда, то есть вы всегдаиметь F и никогда f, независимо от того, что вводится.
int val = 0;
Это переменная, в которой позднее будет находиться соответствующее десятичное значение. Мы будем делать наши вычисления с этой переменной.
for (int i = 0; i < hex.length(); i++)
hex.length()
- количество символов в предоставленной шестнадцатеричной строке.Мы выполняем код внутри этого цикла for один раз для каждого символа.
char c = hex.charAt(i);
Да, char представляет отдельный символ.Мы извлекаем символ из шестнадцатеричной строки по индексу i, поэтому в первой итерации это первый символ, во второй итерации второй символ и т. Д.
int d = digits.indexOf(c);
Мы смотрим, какой индекс символаимеет в цифре-String.Таким образом, мы определяем десятичное представление этой конкретной цифры.Как 0-9 остаются 0-9 и F становится 15.
val = 16*val + d;
Давайте подумаем о том, что мы должны делать.У нас есть десятичное значение цифры.Но в шестнадцатеричном формате эта цифра находится в определенной позиции, с которой она умножается.Как и «1» в «100», на самом деле это не 1, а 100 * 1, потому что он находится в этой позиции.10 в шестнадцатеричном - это 16 в десятичном, потому что у нас есть 1 * 16. Теперь подход здесь немного сложнее.val не инициализирован.val в начале равен 0, а затем содержит кумулятивные значения из предыдущих итераций.Поскольку первый символ в строке является самой высокой позицией, мы не знаем напрямую, на что мы должны умножать, потому что мы не знаем, сколько цифр имеет число (на самом деле мы делаем, но этот подход не использует это),Поэтому мы просто добавляем к нему значение цифры.В последовательных итерациях он будет умножен на 16, чтобы масштабировать его до соответствующего базового значения цифры.Позвольте мне показать вам пример:
Возьмите 25F в качестве шестнадцатеричного числа.Теперь первая итерация берет 2, преобразует его в 2 и добавляет его в val.16 * val
разрешается до 0, поэтому не действует в первый раз.
Следующая итерация умножает 2 на 16, берет 5 (преобразованное в 5) и добавляет его к значению val.Итак, теперь мы имеем (я разбил это математически, чтобы вы поняли это): 2 * 16 + 5
Затем мы получаем F, десятичное 15. Мы умножаем val на 16 и добавляем 15.
Мы получаем 2 * 256 + 5 * 16 + 16 (* 1)
, что на самом деле математически вычисляет десятичное значение этого шестнадцатеричного значения.
Еще одна возможность вычислить val:
val += Math.pow(16, hex.length() - i - 1) * d;