8

Java: как преобразовать массив байтов в строку шестнадцатеричного формата?

1

У меня есть массив байтов, заполненный шестнадцатеричными числами, и простой способ его печати не имеет смысла, так как в нем много непечатаемых элементов. Мне нужно получить точный шестнадцатеричный код в формате: 3a5f771c.

5 ответ(ов)

2

Самое простое решение без использования внешних библиотек и без цифровых констант:

public static String byteArrayToHex(byte[] a) {
    StringBuilder sb = new StringBuilder(a.length * 2);
    for (byte b : a) {
        sb.append(String.format("%02x", b & 0xff));
    }
    return sb.toString();
}

В этом коде мы используем StringBuilder для сборки шестнадцатеричной строки. Обратите внимание, что для корректного преобразования байтов в шестнадцатеричное представление необходимо использовать побитовую операцию & 0xff, чтобы избежать проблем с отрицательными значениями байтов.

0

Вот решение с использованием Guava для полноты картины:

import com.google.common.io.BaseEncoding;
import java.nio.charset.StandardCharsets;

byte[] bytes = "Hello world".getBytes(StandardCharsets.UTF_8);
final String hex = BaseEncoding.base16().lowerCase().encode(bytes);

Теперь переменная hex содержит значение "48656c6c6f20776f726c64".

0

Этот простой однострочник работает для меня:

String result = new BigInteger(1, inputBytes).toString(16);

ПРАВКА: Использование этого способа убирает начальные нули, но, черт возьми, это сработало для моего случая. Спасибо @Voicu за указание на это!

0

Вы можете использовать что-то вроде этого для фиксированной длины, например, для хешей:

md5sum = String.format("%032x", new BigInteger(1, md.digest()));

Этот код преобразует байтовый массив, полученный из хеширования, в строку фиксированной длины, которая в данном случае равна 32 символам (для MD5). String.format с шаблоном "%032x" позволяет отобразить значение в шестнадцатеричном формате, добавляя нули в начале, если это необходимо, чтобы обеспечить полную длину строки.

0

Для преобразования массива байтов в шестнадцатеричную строку с использованием класса DataTypeConverter из пакета javax.xml.bind, вы можете воспользоваться методом printHexBinary(). Вот пример, как это сделать:

import javax.xml.bind.DatatypeConverter;

public class Example {
    public static void main(String[] args) {
        byte[] raw = {0x0A, 0x1B, 0x2C}; // Пример массива байтов
        String hexString = DatatypeConverter.printHexBinary(raw);
        System.out.println(hexString); // Вывод: 0A1B2C
    }
}

В данном примере массив байтов raw преобразуется в шестнадцатеричную строку при помощи метода DatatypeConverter.printHexBinary(), результатом чего является строка 0A1B2C. Обратите внимание, что каждый байт из массива будет представлен в виде двух символов в шестнадцатеричной системе счисления.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь