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 unbytenegativ: primeștiffffffc8în loc dec8.HexFormattratează corect octeții. - Dai lui
parseHexun 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.