
Conversia hex în text mers prost: greșelile de codare care transformă baiții în gunoi
Publicat 24 iul. 2026
Conversia din hex în text pare că ar trebui să fie infailibilă: fiecare pereche de cifre hex e un bait, mapezi baitul la un caracter, gata. În practică eșuează constant, și aproape niciodată pentru că e stricat convertorul — eșuează pentru că hexul e doar un mod de a scrie baiți, iar baiții au nevoie de o codare convenită înainte să însemne vreun caracter anume. Iată ce merge de fapt prost când rezultatul e ilizibil.
Cauza 1: s-a presupus o codare de caractere greșită
De departe cea mai frecventă cauză. Baiții hex au fost codați ca UTF-8 (unde multe caractere din lumea reală ocupă 2–4 baiți), dar convertorul decodează bait cu bait ca și cum ar fi Latin-1 sau ASCII simplu (unde fiecare bait e exact un caracter). Rezultatul: literele cu diacritice, ghilimelele tipografice, liniile de pauză și orice caracter din afara englezei se transformă în două sau trei simboluri stricate în locul unuia corect.
Soluția e mereu să decodezi cu aceeași codare în care au fost scriși baiții inițial — dacă nu știi care e, UTF-8 e alegerea implicită corectă pentru orice e modern (conținut web, JSON, majoritatea API-urilor); Latin-1/Windows-1252 apare în general doar în fișiere text vechi provenite din Windows sau în anteturi de e-mail moștenite.
Cauza 2: nepotriviri de ordine a baiților (endianness)
Aceasta afectează în mod specific valorile numerice pe mai mulți baiți (nu textul), dar e destul de comună în instrumentele hex-în-text care lucrează cu date mixte binar/text ca să merite menționată. 00 01 citit big-endian e 1; aceiași doi baiți citiți little-endian sunt 256. Dacă un șir hex reprezintă un prefix numeric de lungime sau un câmp binar încorporat în date altfel textuale, citirea lui cu ordinea greșită a baiților nu doar interpretează greșit numărul — decalează fiecare poziție de bait care urmează, pentru că instrumentul crede acum că textul începe la offsetul greșit.
Cauza 3: erori de grupare a nibble-urilor
Hexul trebuie să vină întotdeauna în perechi — două cifre hex formează un bait. Un număr impar de caractere hex (o cifră rătăcită, un copy-paste care a pierdut un caracter, un 0x la început care n-a fost eliminat înainte de parsare) decalează fiecare pereche următoare cu un nibble. Fiecare bait de după eroare se decodează într-un caracter complet diferit, fără nicio legătură — rezultatul nu e „ușor greșit“, ci total amestecat din acel punct înainte, ceea ce e de fapt un diagnostic util: gunoiul care începe curat și degenerează undeva pe parcursul șirului indică o eroare de grupare exact la acea poziție, nu o problemă de codare greșită (care corupe mai uniform pe tot parcursul).
Cauza 4: baiți invizibili și neprintabili
Nu fiecare bait corespunde unui caracter vizibil. Caracterele de control (0x00–0x1F), byte-order-mark-ul (EF BB BF în UTF-8) și diverse caractere Unicode de formatare se decodează „cu succes“, dar se afișează ca nimic, o căsuță sau un semn de întrebare, în funcție de fontul de afișare — ceea ce poate arăta identic cu un eșec de decodare, deși conversia în sine a fost complet corectă. Dacă lungimea rezultatului pare corectă, dar textului par să-i lipsească caractere, verifică baiții de control înainte să presupui că logica de decodare e greșită.
Un mod rapid de a izola cu care dintre ele te confrunți
- Confirmă că șirul hex are un număr par de caractere — dacă nu, e cauza 3, corectează mai întâi intrarea.
- Încearcă mai întâi decodarea ca UTF-8, apoi ca Latin-1, și compară — dacă una produce text curat și cealaltă nu, era cauza 1.
- Dacă rezultatul e stricat uniform încă de la primul caracter, suspectează codarea (cauza 1); dacă începe curat și degenerează pe parcurs, suspectează o eroare de grupare (cauza 3) la acea poziție.
- Dacă lungimea corespunde așteptărilor, dar anumite caractere lipsesc sau apar ca niște căsuțe, verifică baiții de control/formatare (cauza 4) în loc să reverifici codarea.
Conversia hex-în-text în sine e o linie de cod în orice limbaj — adevărata muncă de depanare e aproape întotdeauna în a-ți da seama care dintre aceste patru presupuneri a fost, pe tăcute, greșită, nu în logica de conversie.