
De ce conversia binar-text scoate caracterele greșite
Publicat 24 iul. 2026
Un șir de 1 și 0 pare lipsit de ambiguitate — e binar, nu e nimic de interpretat. În practică, conversia din binar în text eșuează exact în aceeași familie de moduri ca hex-în-text, din același motiv de fond: o secvență de biți nu e text până nu ai făcut mai multe presupuneri despre cum să o grupezi și să o interpretezi, iar dacă oricare dintre acele presupuneri e greșită, rezultatul e greșit într-un mod specific, diagnosticabil.
Cauza 1: grupare greșită a biților (7 biți vs. 8 biți)
ASCII standard are nevoie de doar 7 biți per caracter; majoritatea instrumentelor binar-text folosesc implicit baiți de 8 biți, pentru că așa e stocat de fapt textul pe sistemele reale. Dacă un șir binar a fost generat presupunând grupări de 7 biți (unele exemple de manual și sisteme mai vechi încă fac asta) și îl decodezi ca baiți de 8 biți, absolut fiecare caracter iese decalat — granița de grupare e greșită încă de la primul bit, așa că coruperea e uniformă pe tot rezultatul, în loc să înceapă curat și să degenereze pe parcurs.
Indiciul: dacă literalmente fiecare caracter din rezultat e greșit, nu doar unele, verifică presupunerea despre gruparea biților înainte de orice altceva.
Cauza 2: un bit în plus sau lipsă decalează tot ce urmează
E echivalentul binar al unei cifre hex impare — un singur 0 sau 1 rătăcit (un caracter în plus de la copy-paste, o cifră pierdută, un spațiu interpretat ca dată) decalează granița de bait pentru fiecare grup de după acel punct. Spre deosebire de cauza 1, asta produce text corect până la un punct și amestecat după — un semnal puternic că numărul de biți în sine e greșit undeva în șir, nu că schema de codare e greșită peste tot.
Numără mai întâi biții în total: lungimea șirului trebuie să fie un multiplu exact de 8 (sau de 7, dacă ai confirmat că aceea e gruparea folosită). Dacă nu e, bitul în plus sau lipsă e bug-ul, nu decodorul.
Cauza 3: codarea caracterelor, exact ca la hex
Odată ce biții sunt grupați corect în baiți, tot mai trebuie să decizi ce înseamnă acele valori de bait drept caractere — UTF-8, ASCII, Latin-1. E identic cu cazul hex-în-text: caracterele UTF-8 pe mai mulți baiți (litere cu diacritice, simboluri, scrieri nelatine), decodate bait cu bait ca și cum fiecare bait ar fi propriul caracter, produc două sau trei simboluri stricate în locul unuia corect. Dacă gruparea biților e confirmată corectă (cauzele 1 și 2 excluse) și rezultatul e tot greșit mai ales în jurul caracterelor non-ASCII, aceasta e aproape întotdeauna cauza rămasă.
Cauza 4: endianness, pentru binar care reprezintă numere, nu text
Dacă șirul binar codează o valoare numerică, nu date de tip caracter — un prefix de lungime, un checksum, un ID încorporat lângă text — ordinea biților/baiților contează și nu există un implicit universal. 00000001 ca bait de sine stătător e lipsit de ambiguitate, dar valorile numerice pe mai mulți baiți pot fi stocate cu baitul cel mai semnificativ primul sau ultimul, în funcție de sistemul care le-a produs, iar citirea cu presupunerea greșită produce pe tăcute un alt număr greșit, dar cu aspect plauzibil, nu o eroare evidentă.
Diagnosticarea în ordine
- Verifică dacă numărul total de biți e un multiplu exact al grupării presupuse (8, de obicei) — un număr nepotrivit înseamnă cauza 2, corectează intrarea.
- Dacă fiecare caracter e greșit uniform de la început, suspectează dimensiunea grupării în sine (cauza 1) înainte să atingi codarea.
- Dacă rezultatul e curat la început și degenerează pe parcurs, asta localizează un bit rătăcit/lipsă la acea poziție (cauza 2), nu o problemă de codare.
- Dacă gruparea și numărul de biți sunt în regulă și doar caracterele non-ASCII arată greșit, e codarea caracterelor (cauza 3).
- Dacă datele reprezintă un număr, nu text, iar valoarea pare plauzibilă dar greșită, verifică ordinea baiților (cauza 4) înainte să presupui că logica de conversie e stricată.
Ca și la hex, pasul de conversie e banal — adevăratul bug trăiește aproape întotdeauna în una dintre aceste patru presupuneri, nu în codul care face conversia.