Как преобразовать шестнадцатеричную строку в строку Java?
Заголовок: Проблема с декодированием шестнадцатеричной строки обратно в строку в Java
Текст:
Для целей логирования я преобразую логи в массив байтов, а затем в шестнадцатеричную строку. Теперь мне нужно вернуть это обратно в строку Java, но я не могу этого сделать.
Шестнадцатеричная строка в файле логов выглядит примерно так:
fd00000aa8660b5b010006acdc0100000101000100010000
Как я могу декодировать эту строку обратно в строку Java?
5 ответ(ов)
Если вы хотите преобразовать шестнадцатеричную строку в массив байтов, а затем получить строку с указанной кодировкой, вы можете использовать следующий код на Java:
byte[] bytes = javax.xml.bind.DatatypeConverter.parseHexBinary(hexString);
String result = new String(bytes, encoding);
Здесь hexString
— это ваша шестнадцатеричная строка, а encoding
— кодировка, которую вы хотите использовать для преобразования массива байтов в строку (например, "UTF-8").
Не забудьте импортировать необходимые библиотеки, если они еще не подключены:
import javax.xml.bind.DatatypeConverter;
Этот код сначала использует метод parseHexBinary
для преобразования шестнадцатеричной строки в массив байтов, а затем создает строку на основе этих байтов с заданной кодировкой. Убедитесь, что кодировка поддерживается и корректна, иначе вы можете столкнуться с проблемами при преобразовании.
Чтобы преобразовать строку в шестнадцатеричном формате (String (hex)
) в массив байтов (byte array
), а затем в строку в кодировке UTF-8, вы можете использовать следующий метод. Обратите внимание, что ваша шестнадцатеричная строка не должна содержать ведущих пробелов или других символов.
Вот код, который выполняет данное преобразование:
public static byte[] hexStringToByteArray(String hex) {
int l = hex.length();
byte[] data = new byte[l / 2];
for (int i = 0; i < l; i += 2) {
data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
+ Character.digit(hex.charAt(i + 1), 16));
}
return data;
}
Пример использования:
String b = "0xfd00000aa8660b5b010006acdc0100000101000100010000";
byte[] bytes = hexStringToByteArray(b);
String st = new String(bytes, StandardCharsets.UTF_8);
System.out.println(st);
В данном коде hexStringToByteArray
принимает строку в шестнадцатеричном формате и возвращает массив байтов. Затем этот массив байтов преобразуется в строку с использованием кодировки UTF-8. Убедитесь, что передаваемая строка корректна и не содержит лишних символов, иначе преобразование может привести к ошибкам или некорректным результатам.
Сначала прочитайте данные, затем преобразуйте их в байтовый массив:
byte b = Byte.parseByte(str, 16);
После этого используйте конструктор String
:
new String(byte[] bytes)
Если кодировка отличается от системной по умолчанию, то используйте:
new String(byte[] bytes, String charsetName)
Не забудьте передать корректный байтовый массив, чтобы получить ожидаемую строку.
Вы можете использовать следующий код для декодирования шестнадцатеричной строки в массив байтов:
public static byte[] decode(String hex) {
String[] list = hex.split("(?<=\\G.{2})");
ByteBuffer buffer = ByteBuffer.allocate(list.length);
System.out.println(list.length);
for(String str : list) {
buffer.put(Byte.parseByte(str, 16));
}
return buffer.array();
}
После того как вы получите массив байтов с помощью метода decode
, вы можете создать строку, используя этот массив байтов. Например, вы можете сделать это следующим образом:
byte[] byteArray = decode("your_hex_string_here");
String result = new String(byteArray);
Вам нужно убедиться, что строка, которую вы передаете в метод decode
, является корректной шестнадцатеричной строкой. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать!
Вот еще один способ преобразовать шестнадцатеричную строку в строку Java:
public static String unHex(String arg) {
String str = "";
for(int i = 0; i < arg.length(); i += 2) {
String s = arg.substring(i, (i + 2));
int decimal = Integer.parseInt(s, 16);
str += (char) decimal;
}
return str;
}
В этом коде мы проходим по каждой паре символов в шестнадцатеричной строке, преобразуем их в десятичное значение с помощью Integer.parseInt(s, 16)
, а затем преобразуем это значение в символ и добавляем его к результатирующей строке. В итоге мы получаем строку, представляющую исходные символы. Обратите внимание, что использование String
для конкатенации может быть неэффективным для больших строк; в таких случаях лучше использовать StringBuilder
.
Почему этот код с использованием случайных строк выводит "hello world"?
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как сгенерировать случайную алфавитно-цифровую строку
Как преобразовать строку Java в byte[]?
Проверьте, что строка не равна null и не пуста