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