Вопрос-ответ

Java: convert a byte array to a hex string?

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

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

Переведено автоматически
Ответ 1

Из обсуждения здесь, и особенно из этого ответа, это функция, которую я использую в настоящее время:

private static final char[] HEX_ARRAY = "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] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}

Мои собственные крошечные тесты (миллион байт в тысячу раз, 256 байт в 10 миллионов раз) показали, что это намного быстрее, чем любая другая альтернатива, примерно в два раза быстрее для длинных массивов. По сравнению с ответом, из которого я его взял, переключение на побитовые операции --- как предлагалось в обсуждении --- сократите примерно на 20% время для длинных массивов. (Редактировать: когда я говорю, что это быстрее, чем альтернативные варианты, я имею в виду альтернативный код, предложенный в обсуждениях. Производительность эквивалентна кодеку Commons, который использует очень похожий код.)

версия 2k20 для компактных строк Java 9:

private static final byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII);
public static String bytesToHex(byte[] bytes) {
byte[] hexChars = new byte[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars, StandardCharsets.UTF_8);
}
Ответ 2

В библиотеке Apache Commons Codec есть класс Hex для выполнения именно этого типа работы.

import org.apache.commons.codec.binary.Hex;

String foo = "I am a string";
byte[] bytes = foo.getBytes();
System.out.println( Hex.encodeHexString( bytes ) );
Ответ 3

Метод javax.xml.bind.DatatypeConverter.printHexBinary(), являющийся частью Java Architecture for XML Binding (JAXB), был удобным способом преобразования byte[] в шестнадцатеричную строку. В DatatypeConverter класс также включено множество других полезных методов манипулирования данными.

В Java 8 и более ранних версиях JAXB был частью стандартной библиотеки Java. Он был устаревшим с Java 9 и удален с Java 11, как часть попытки переместить все пакеты Java EE в их собственные библиотеки. Это долгая история. Теперь, javax.xml.bind не существует, и если вы хотите использовать JAXB, который содержит DatatypeConverter, вам нужно будет установить JAXB API и JAXB Runtime из Maven.

Пример использования:

byte bytes[] = {(byte)0, (byte)0, (byte)134, (byte)0, (byte)61};
String hex = javax.xml.bind.DatatypeConverter.printHexBinary(bytes);

Приведет к:

000086003D

Этот ответ такой же, как этот.

Ответ 4

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

public static String byteArrayToHex(byte[] a) {
StringBuilder sb = new StringBuilder(a.length * 2);
for(byte b: a)
sb.append(String.format("%02x", b));
return sb.toString();
}
2024-02-28 02:50 java arrays