Я пытаюсь понять, как преобразовать шестнадцатеричный код в строку и целое число, чтобы я мог управлять светом 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; части я не понимаю.

0
Aspen 6 Окт 2018 в 09:35

1 ответ

Лучший ответ

Хорошо, пойдем строка за строкой

public static int getDecimal(String hex)

Hex - это параметр, он должен быть объявлен там, поэтому вы можете передать String при вызове функции.

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

Мы смотрим, какой индекс у символа есть в digit-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. Мы умножаем значение на 16 и складываем 15.

Мы получаем 2 * 256 + 5 * 16 + 16 (* 1), что фактически является тем, как вы вычисляете десятичное значение этого шестнадцатеричного значения математически.

Другая возможность вычислить val:

val += Math.pow(16, hex.length() - i - 1) * d;
3
birdfreeyahoo 6 Окт 2018 в 06:57