Преобразование byte[] в HEX-строку на Java — все способы с примерами

Массив байтов часто нужно представить в виде hex-строки — например, для отображения хеш-сумм или содержимого бинарных файлов. В Java это можно сделать как с помощью String.format(), так и через побитовые операции (что быстрее).

Чтобы понять этот пример, нужно знать:

  • Массивы в Java

  • Классы и объекты в Java

Пример 1: преобразование массива байтов в hex через format

public class ByteHex {

    public static void main(String[] args) {

        byte[] bytes = {10, 2, 15, 11};

        for (byte b : bytes) {
            String st = String.format("%02X", b);
            System.out.print(st);
        }
    }
}

Вывод:

0A020F0B

В этой программе у нас есть массив байтов bytes. Чтобы перевести его в шестнадцатеричный вид, мы перебираем каждый байт и применяем метод String.format().

Спецификатор %02X означает «вывести шестнадцатеричное значение (X) с минимальной шириной 2 знака (02), при необходимости дополнить ведущим нулём».

Этот способ относительно медленный для больших массивов. Заметно ускорить можно через побитовые операции.

Пример 2: преобразование массива байтов в hex через побитовые операции

public class ByteHex {

    private final static char[] hexArray = "0123456789ABCDEF".toCharArray();
    public static String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for ( int j = 0; j < bytes.length; j++ ) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        return new String(hexChars);
    }

    public static void main(String[] args) {

        byte[] bytes = {10, 2, 15, 11};

        String s = bytesToHex(bytes);
        System.out.println(s);

    }
}

Вывод этой программы такой же, как у Примера 1:

0A020F0B

Примечание

Побитовый сдвиг v >>> 4 выделяет старшую тетраду байта, а v & 0x0F — младшую. Каждая тетрада превращается в один шестнадцатеричный символ.