HexFormat în Java

Transformă octeți în text hexazecimal (00–ff) și înapoi; of creează formatatorul, formatHex face conversia.

Sintaxă
import java.util.HexFormat;

static HexFormat of()
static HexFormat ofDelimiter(String separator)
String formatHex(byte[] octeti)
byte[] parseHex(CharSequence text)
String toHexDigits(int valoare)

Ce face HexFormat

Hexazecimalul scrie fiecare octet cu două caractere din 0-9 și a-f: octetul 255 devine ff, 10 devine 0a. Este forma obișnuită pentru sume de control (hash-uri), culori (#ff8800), adrese MAC și depanarea datelor binare.

HexFormat.of() returnează formatatorul simplu (litere mici, fără separator). formatHex(octeti) produce textul, iar parseHex(text) face drumul invers. Variantele ofDelimiter(":"), withUpperCase() și withPrefix("0x") schimbă aspectul. toHexDigits(valoare) scrie un număr cu toate cifrele hex (de exemplu 8 pentru un int).

Obiectele HexFormat nu se modifică; fiecare metodă with... returnează unul nou. Înainte de Java 17 se folosea String.format("%02x", b) pentru fiecare octet.

Parametri

Parametru Descriere
separator Pentru ofDelimiter: textul pus între octeți.
octeti Pentru formatHex: datele de transformat.

Ce returnează

of: un HexFormat. formatHex: un String.

Exemple

Exemplul 1: Octeții unui text cu diacritice

import java.nio.charset.StandardCharsets;
import java.util.HexFormat;

public class Main {
    public static void main(String[] args) {
        byte[] octeti = "Iași".getBytes(StandardCharsets.UTF_8);
        HexFormat hex = HexFormat.of();

        System.out.println(hex.formatHex(octeti));
        System.out.println(HexFormat.ofDelimiter(" ").withUpperCase().formatHex(octeti));
        System.out.println(new String(hex.parseHex("436c756a"), StandardCharsets.UTF_8));
        System.out.println(hex.toHexDigits((byte) 200) + " " + hex.toHexDigits(2026));
    }
}

Rezultat

4961c89969
49 61 C8 99 69
Cluj
c8 000007ea

Exemplul 2: Suma de control SHA-256 a unui fișier

MessageDigest calculează amprenta octeților; o afișăm în hex, ca pe site-urile de descărcări. Aceeași intrare dă mereu aceeași amprentă.

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.MessageDigest;
import java.util.HexFormat;

public class Main {
    public static void main(String[] args) throws Exception {
        Path fisier = Files.writeString(Path.of("contract.txt"), "Contract nr. 15/2026", StandardCharsets.UTF_8);

        byte[] amprenta = MessageDigest.getInstance("SHA-256").digest(Files.readAllBytes(fisier));
        System.out.println("SHA-256: " + HexFormat.of().formatHex(amprenta));
        System.out.println("Octeți: " + amprenta.length + ", caractere hex: " + HexFormat.of().formatHex(amprenta).length());
        System.out.println("Ca MAC: " + HexFormat.ofDelimiter(":").withUpperCase().formatHex(amprenta, 0, 6));
    }
}

Rezultat

SHA-256: 1acf5592a071b4a4fa9272bcad8e54d643544a5517047971f52a3d1b25e7938c
Octeți: 32, caractere hex: 64
Ca MAC: 1A:CF:55:92:A0:71

Greșeli frecvente

  • Folosești Integer.toHexString(b) pe un byte negativ: primești ffffffc8 în loc de c8. HexFormat tratează corect octeții.
  • Dai lui parseHex un text cu număr impar de caractere sau cu litere în afara lui a–f: IllegalArgumentException.

Comenzi înrudite

  • Base64: Transformă octeți în text sigur (litere, cifre, +, /) și înapoi; getEncoder codează, getDecoder decodează.
  • StandardCharsets: Constante pentru codările de text garantate în orice Java; UTF_8 este codarea potrivită pentru diacriticele românești.
  • PrintStream.printf: Afișează text formatat după un șablon cu %s, %d, %.2f, %n: numere cu zecimale fixe, coloane aliniate.