Преобразование шестнадцатеричного в десятичное в Java: пользовательская логика - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь выяснить, как преобразовать гекс в строку и целое число, чтобы я мог манипулировать RGB-подсветкой на моем микроконтроллере Arduino через его последовательный порт.Я нашел хороший пример на веб-сайте Java, но мне трудно понять некоторые методы, и я зацикливаюсь.Я мог бы просто скопировать и вставить этот код и заставить его работать, но я хочу полностью понять его.Я добавлю комментарии к своему пониманию, и, надеюсь, кто-то может высказать свое мнение.

public class HexToDecimalExample3{    
public static int getDecimal(String hex){    //this is the function which we will call later and they are declaring string hex here. Can we declare string hex inside the scope..?
    String digits = "0123456789ABCDEF";      //declaring string "digits" with all possible inputs in linear order for later indexing
             hex = hex.toUpperCase();        //converting string to uppercase, just "in case"
             int val = 0;                    //declaring int val. I don't get this part.
             for (int i = 0; i < hex.length(); i++)  //hex.length is how long the string is I think, so we don't finish the loop until all letters in string is done. pls validate this
             {  
                 char c = hex.charAt(i);     //char is completely new to me. Are we taking the characters from the string 'hex' and making an indexed array of a sort? It seems similar to indexOf but non-linear? help me understand this..
                 int d = digits.indexOf(c);  //indexing linearly where 0=1 and A=11 and storing to an integer variable
                 val = 16*val + d;           //How do we multiply 16(bits) by val=0 to get a converted value? I do not get this..
             }  
             return val;  
}  
public static void main(String args[]){    
System.out.println("Decimal of a is: "+getDecimal("a"));  //printing the conversions out.
System.out.println("Decimal of f is: "+getDecimal("f"));  
System.out.println("Decimal of 121 is: "+getDecimal("121"));  
}}    

Чтобы суммировать комментарии, это прежде всего char c = hex.charAt (i); И val = 16 * val + d;части я не понимаю.

1 Ответ

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

Хорошо, давайте перейдем к строке для строки

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;
...