Java: Impressão de bytes como hexa

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
This entry was posted in Java. Bookmark the permalink.

One Response to Java: Impressão de bytes como hexa

  1. Davi says:

    Boa explicação ! Bom código.

    Só para constar…outra alternativa seria o codec do apache.
    org.apache.commons.codec.binary.Hex

Leave a Reply

Your email address will not be published. Required fields are marked *