Вот несколько примеров преобразования Java между строкой или ASCII в и из//Шестнадцатеричный .
- Кодек Apache Commons – Шестнадцатеричный
- Целое число
- Побитовый
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
1. Кодек Apache Commons
Оба Шестнадцатеричный код.
и Hex.decodehex
может преобразовывать строку в шестнадцатеричную и наоборот.
commons-codec commons-codec 1.14
package com.mkyong; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; import java.nio.charset.StandardCharsets; public class HexUtils { public static void main(String[] args) { String input = "a"; System.out.println("input : " + input); String hex = convertStringToHex(input); System.out.println("hex : " + hex); String result = convertHexToString(hex); System.out.println("result : " + result); } public static String convertStringToHex(String str) { // display in uppercase //char[] chars = Hex.encodeHex(str.getBytes(StandardCharsets.UTF_8), false); // display in lowercase, default char[] chars = Hex.encodeHex(str.getBytes(StandardCharsets.UTF_8)); return String.valueOf(chars); } public static String convertHexToString(String hex) { String result = ""; try { byte[] bytes = Hex.decodeHex(hex); result = new String(bytes, StandardCharsets.UTF_8); } catch (DecoderException e) { throw new IllegalArgumentException("Invalid Hex format!"); } return result; } }
Выход
input : a hex : 61 result : a
2. Целое число
Этот пример прост для понимания, используйте JDK Целое число
API, такие как Целое число.toHexString
и Integer.parseInt(шестнадцатеричный, 16)
для преобразования строки в шестнадцатеричный и наоборот.
Идея в том, чтобы преобразовать Строка <==> Десятичное число <==> Шестнадцатеричный
, например, символ a
, десятичный – 97, шестнадцатеричный – 61.
package com.mkyong; public class HexUtils2 { public static void main(String[] args) { String input = "a"; System.out.println("input : " + input); String hex = convertStringToHex(input); System.out.println("hex : " + hex); String result = convertHexToString(hex); System.out.println("result : " + result); } // Char -> Decimal -> Hex public static String convertStringToHex(String str) { StringBuffer hex = new StringBuffer(); // loop chars one by one for (char temp : str.toCharArray()) { // convert char to int, for char `a` decimal 97 int decimal = (int) temp; // convert int to hex, for decimal 97 hex 61 hex.append(Integer.toHexString(decimal)); } return hex.toString(); } // Hex -> Decimal -> Char public static String convertHexToString(String hex) { StringBuilder result = new StringBuilder(); // split into two chars per loop, hex, 0A, 0B, 0C... for (int i = 0; i < hex.length() - 1; i += 2) { String tempInHex = hex.substring(i, (i + 2)); //convert hex to decimal int decimal = Integer.parseInt(tempInHex, 16); // convert the decimal to char result.append((char) decimal); } return result.toString(); } }
Выход
input : a hex : 61 result : a
Для ввода Ява
input : java hex : 6a617661 result : java
3. Побитовый
Это побитовое преобразование аналогично исходному коду кодека Apache Commons, прочитайте комментарий для пояснения.
package com.mkyong; import java.nio.charset.StandardCharsets; public class HexUtils3 { private static final char[] HEX_UPPER = "0123456789ABCDEF".toCharArray(); private static final char[] HEX_LOWER = "0123456789abcdef".toCharArray(); public static void main(String[] args) { String input = "java"; System.out.println("input : " + input); String hex = convertStringToHex(input, false); System.out.println("hex : " + hex); } public static String convertStringToHex(String str, boolean lowercase) { char[] HEX_ARRAY = lowercase ? HEX_LOWER : HEX_UPPER; byte[] bytes = str.getBytes(StandardCharsets.UTF_8); // two chars form the hex value. char[] hex = new char[bytes.length * 2]; for (int j = 0; j < bytes.length; j++) { // 1 byte = 8 bits, // upper 4 bits is the first half of hex // lower 4 bits is the second half of hex // combine both and we will get the hex value, 0A, 0B, 0C int v = bytes[j] & 0xFF; // byte widened to int, need mask 0xff // prevent sign extension for negative number hex[j * 2] = HEX_ARRAY[v >>> 4]; // get upper 4 bits hex[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; // get lower 4 bits } return new String(hex); } }
Выход
input : java hex : 6A617661
Примечание Если вы в замешательстве, выберите кодек Apache Commons для безопасной ставки.
Рекомендации
- Википедия – ASCII
- Википедия – Шестнадцатеричный
- Операторы побитового и битового сдвига
- Как преобразовать массив байтов в строку в Java
- Шестнадцатеричный JavaDoc Apache
- Шестиугольный
- Java и “&0xFF” пример
Оригинал: “https://mkyong.com/java/how-to-convert-hex-to-ascii-in-java/”