Java: как преобразовать массив байтов в строку шестнадцатеричного формата?
У меня есть массив байтов, заполненный шестнадцатеричными числами, и простой способ его печати не имеет смысла, так как в нем много непечатаемых элементов. Мне нужно получить точный шестнадцатеричный код в формате: 3a5f771c
.
5 ответ(ов)
Самое простое решение без использования внешних библиотек и без цифровых констант:
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
, чтобы избежать проблем с отрицательными значениями байтов.
Вот решение с использованием 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"
.
Этот простой однострочник работает для меня:
String result = new BigInteger(1, inputBytes).toString(16);
ПРАВКА: Использование этого способа убирает начальные нули, но, черт возьми, это сработало для моего случая. Спасибо @Voicu за указание на это!
Вы можете использовать что-то вроде этого для фиксированной длины, например, для хешей:
md5sum = String.format("%032x", new BigInteger(1, md.digest()));
Этот код преобразует байтовый массив, полученный из хеширования, в строку фиксированной длины, которая в данном случае равна 32 символам (для MD5). String.format
с шаблоном "%032x"
позволяет отобразить значение в шестнадцатеричном формате, добавляя нули в начале, если это необходимо, чтобы обеспечить полную длину строки.
Для преобразования массива байтов в шестнадцатеричную строку с использованием класса 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
. Обратите внимание, что каждый байт из массива будет представлен в виде двух символов в шестнадцатеричной системе счисления.
Как определить, содержится ли определенное значение в массиве в Java?
Как объединить два массива в Java?
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как создать обобщённый массив в Java?
Преобразование списка в массив в Java