
Zakaj tvoja pretvorba binarnega zapisa v besedilo da napačne znake
Objavljeno 24. jul. 2026
Niz ničel in enic je videti nedvoumen — gre za binarni zapis, ni česa razlagati. V praksi pa pretvorba binarnega zapisa v besedilo odpove na povsem enak način kot hex v besedilo, iz istega osnovnega razloga: zaporedje bitov ni besedilo, dokler nisi sprejel nekaj predpostavk o tem, kako ga združiti in razlagati, napačna katera koli od teh predpostavk pa da izhod, ki je napačen na specifičen, diagnosticiran način.
Vzrok 1: napačno združevanje bitov (7-bitno proti 8-bitnemu)
Standardni ASCII potrebuje le 7 bitov na znak; večina orodij za pretvorbo binarnega zapisa v besedilo privzeto uporablja 8-bitne bajte, ker je tako besedilo dejansko shranjeno v resničnih sistemih. Če je bil binarni niz ustvarjen s predpostavko 7-bitnega združevanja (nekateri učbeniški primeri in starejši sistemi to še vedno počnejo), ti pa ga dekodiraš kot 8-bitne bajte, se vsak posamezen znak izmakne — meja združevanja je napačna že od prvega bita, zato je popačenje enakomerno skozi celoten izhod, namesto da bi se začelo čisto in popačilo šele nekje vmes.
Znak za to: če je dobesedno vsak znak v izhodu napačen, ne le nekateri, najprej preveri predpostavko o združevanju bitov.
Vzrok 2: dodaten ali manjkajoč bit zamakne vse za njim
To je binarni ekvivalent lihe hex števke — en sam zablodel 0 ali 1 (dodaten znak iz kopiranja in lepljenja, izgubljena števka, presledek, ki se je razčlenil kot podatek) zamakne mejo bajta za vsako naslednjo skupino po tej točki. Za razliko od vzroka 1 to da besedilo, ki je pravilno do neke točke in popačeno po njej — močan znak, da je sam štetje bitov nekje v nizu narobe, ne pa da je shema kodiranja narobe skozi celoto.
Najprej preštej skupno število bitov: dolžina niza bi morala biti čist večkratnik 8 (ali 7, če si potrdil, da se uporablja tako združevanje). Če ni, je dodaten ali manjkajoč bit hrošč, ne dekodirnik.
Vzrok 3: kodiranje znakov, popolnoma enako kot pri hex
Ko so biti pravilno združeni v bajte, se moraš še vedno odločiti, kaj te vrednosti bajtov pomenijo kot znaki — UTF-8, ASCII, Latin-1. To je identično primeru hex v besedilo: večbajtni znaki UTF-8 (naglašene črke, simboli, neantični pisavi), dekodirani en bajt naenkrat, kot da bi bil vsak bajt svoj lasten znak, dajo dva ali tri popačene simbole namesto enega pravilnega. Če je združevanje bitov potrjeno pravilno (vzroka 1 in 2 izključena) in je izhod še vedno napačen prav okoli neangleških znakov, je to skoraj vedno preostali vzrok.
Vzrok 4: vrstni red bajtov, za binarne podatke, ki predstavljajo številke, ne besedilo
Če binarni niz kodira številsko vrednost namesto znakovnih podatkov — predpono dolžine, kontrolno vsoto, ID vgrajen ob besedilu — je vrstni red bitov/bajtov pomemben, univerzalne privzete vrednosti pa ni. 00000001 kot samostojen bajt je nedvoumen, a večbajtne številske vrednosti se lahko shranijo z najpomembnejšim bajtom najprej ali najmanj pomembnim bajtom najprej, odvisno od sistema, ki jih je ustvaril, branje z napačno predpostavko pa tiho ustvari drugačno, verjetno videti, a napačno številko namesto očitne napake.
Diagnosticiranje po vrstnem redu
- Preveri, da je skupno število bitov čist večkratnik predpostavljenega združevanja (običajno 8) — napačno število pomeni vzrok 2, popravi vhod.
- Če je vsak znak enakomerno napačen že od začetka, posumi na samo velikost združevanja (vzrok 1), preden se lotiš kodiranja.
- Če je izhod na začetku čist in se popači nekje vmes, to natančno določi zablodel/manjkajoč bit na tistem mestu (vzrok 2), ne težave s kodiranjem.
- Če se združevanje in štetje bitov oba ujemata in izgleda narobe le pri neangleških znakih, gre za kodiranje znakov (vzrok 3).
- Če podatki predstavljajo številko namesto besedila in je vrednost videti verjetna, a napačna, preveri vrstni red bajtov (vzrok 4), preden domnevaš, da je sama logika pretvorbe pokvarjena.
Tako kot pri hex je korak pretvorbe trivialen — dejanski hrošč skoraj vedno tiči v eni od teh štirih predpostavk, ne v kodi, ki opravlja pretvorbo.