Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Chuyển đổi String ↔ Hexadecimal trong Java

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

Java 17+: HexFormat (chuẩn, dễ dùng)


import java.util.HexFormat;

HexFormat hf = HexFormat.of();
// String -> UTF-8 bytes -> Hex
String hex = hf.formatHex("Hello".getBytes(StandardCharsets.UTF_8));
// Hex -> UTF-8 bytes -> String
String str = new String(hf.parseHex(hex), StandardCharsets.UTF_8);
Vấn đềGiải thích
Unicode > 0xFFFFchar Java chỉ 16-bit, cần codePoint (surrogate pair). Dùng codePointAt + Character.toChars
EncodingHex ở đâ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 zeroLuôn format %02x hoặc %04x để parse ngược đúng