Chuyển chuỗi ký tự sang biểu diễn hex và ngược lại.
String → Hex
Mỗi char → mã Unicode (int) → hex string.
public static String toHex(String str) {
if (str == null) return null;
StringBuilder sb = new StringBuilder(str.length() * 2);
for (char ch : str.toCharArray()) {
sb.append(String.format("%04x", (int) ch)); // 4 hex digits cho Unicode
// hoặc sb.append(Integer.toHexString(ch)); // không pad leading zero
}
return sb.toString();
}
Hex → String
Đọc từng cặp 4 hex digit (hoặc 2 cho ASCII) → parse int base 16 → char.
public static String fromHex(String hex) {
if (hex == null || hex.length() % 4 != 0) return null; // giả định 4 hex/char
StringBuilder sb = new StringBuilder(hex.length() / 4);
for (int i = 0; i < hex.length(); i += 4) {
String hexChar = hex.substring(i, i + 4);
int codePoint = Integer.parseInt(hexChar, 16);
sb.append((char) codePoint);
}
return sb.toString();
}
Ví dụ hoàn chỉnh (ASCII 2 hex digits/char)
import java.util.Scanner;
public class StringHexConvert {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Nhập chuỗi: ");
String input = sc.nextLine();
// String -> Hex (2 hex/char cho ASCII)
StringBuilder hex = new StringBuilder();
for (char c : input.toCharArray()) {
hex.append(String.format("%02x", (int) c));
}
System.out.println("Hex: " + hex);
// Hex -> String
StringBuilder back = new StringBuilder();
for (int i = 0; i < hex.length(); i += 2) {
int val = Integer.parseInt(hex.substring(i, i+2), 16);
back.append((char) val);
}
System.out.println("Ngược lại: " + back);
}
}
Kết quả
Nhập chuỗi: Hello
Hex: 48656c6c6f
Ngược lại: Hello
Lưu ý quan trọng
| Vấn đề | Giải thích |
|---|---|
| Unicode > 0xFFFF | char Java chỉ 16-bit, cần codePoint (surrogate pair). Dùng codePointAt + Character.toChars |
| Encoding | Hex ở đây là Unicode code point, KHÔNG phải UTF-8 bytes. Muốn UTF-8 hex: bytes = str.getBytes(StandardCharsets.UTF_8) → hex |
| Leading zero | Luôn format %02x hoặc %04x để parse ngược đúng |