Então, pessoal. Ontem eu tive a necessidade de fazer uma conversão de um array de bytes MD5 para uma String hexadecimal. Com um código apresentado pelo entanglementaqui, e algumas adaptações tudo funcionou como deveria.
Mas qual o problema? Eu não faço ideia de como esse código funciona. O problema aqui não é o que deve ser feito, mas como foi feito. Alguém consegue me explicar como esse código funciona? Eu realmente não gosto de usar um código que não entendo hehehe.
Alguns links para um material que me ajuda já serão suficientes, só quero saber como pesquisar. Fazendo pesquisas no google eu só encontro métodos com código pronto, e não é isso que eu quero.
Só pra constar aqui no tópico. O método do entanglement é esse:
private static char[] hexDigits = "0123456789ABCDEF".toCharArray();
public static String hex (byte[] digest) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
sb.append(hexDigits[(digest[i] >> 4) & 0xF]);
sb.append(hexDigits[digest[i] & 0xF]);
}
return sb.toString();
}
Imagine que você tem 1 byte. Ele é formado por 2 caracteres hexa. Vamos supor o número 0x5A
0x5A = 0101 1010
Você quer separar individualmente os dois caracteres que compõe esse número hexadecimal. Uma das formas é fazer um &, colocando um nos bits relevantes. Nesse caso, você gostaria de separar os últimos 4 bits, ou seja, fazer um & com:
[code]0101 1010 //0x5A
0000 1111 & //0x0F
0000 1010 //0x0A
[/code]
Como você pode ver, agora o caracter A está separado do número 5. Mas você também quer imprimir o 5, certo?
Como separa-lo? A resposta é: vamos "empurrar" os bits da frente quatro bits para direita. Assim, ao fazermos o &, faremos com os bits da frente:
[code]0101 1010 //0x5A
0000 0101 //Afastando 4 bits para a direita: 0x5A >> 4 = 0x05
0000 1111 & //0x0F
0000 0101 //0x05
[/code]
Bom, agora você tem o número 0xA (10 decimal) e o número 0x5 (5 decimal).
Basta usar a função Integer.toString para imprimir esses valores em hexa.