Palavras-chave: java, byte, conversão, hexadecimal
Em Java, as conversões e promoções numéricas às vezes fazem tarefas simples parecerem complicadas. A seguir, um método rápido para imprimir um array de bytes.
public class ImpressaoBytes {
public static void main(String[] args) {
System.out.println(paraStringHexa(
new byte[] { 0x0F, 0x7f, 0x3d, 0x00, -0x23 }));
}
private static String paraStringHexa(byte[] bytes) {
StringBuilder s = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
int parteAlta = ((bytes[i] >> 4) & 0xf) << 4;
int parteBaixa = bytes[i] & 0xf;
if (parteAlta == 0) s.append('0');
s.append(Integer.toHexString(parteAlta | parteBaixa));
}
return s.toString();
}
}
Para cada byte, o truque é simples: deslocamos para a direita, desprezamos o que não seja a quadra menos significativa (& 0xf) e deslocamos de volta para a esquerda; para a parte baixa, é só desprezar o que não for a quadra menos significativa.
Então basta usar o conversor de int para string hexa. A saída do programa será:
0f7f3d00dd
Uma provável tentativa seria substituir o laço por:
for (int i = 0; i < bytes.length; i++) {
s.append(Integer.toHexString(bytes[i]));
}
Mas isso falharia ao se tentar imprimir bytes “negativos”, como o último de nosso array de exemplo. A saída incorreta seria:
f7f3d0ffffffdd





Boa explicação ! Bom código.
Só para constar…outra alternativa seria o codec do apache.
org.apache.commons.codec.binary.Hex