CodeKitHub
Miks su binaar-teksti teisendus väljastab valed märgid

Miks su binaar-teksti teisendus väljastab valed märgid

Avaldatud 24. juuli 2026

Ühtede ja nullide jada näib üheselt mõistetav — see on binaarne, siin pole midagi tõlgendada. Praktikas ebaõnnestub binaari teksiks teisendamine täpselt samal viisil, nagu hex-tekst teisendus, samal alusel: bitijada pole tekst enne, kui oled teinud mitu eeldust selle kohta, kuidas seda rühmitada ja tõlgendada, ning ühegi neist eelduste valesti tegemine annab väljundi, mis on vale kindlal, diagnoositaval viisil.

Põhjus 1: vale bitirühmitus (7-bit vs 8-bit)

Standardne ASCII vajab märgi kohta ainult 7 bitti; enamik binaar-teksti tööriistu kasutab vaikimisi 8-bitiseid baite, sest just nii tekst päris süsteemides salvestatakse. Kui binaarstring genereeriti eeldades 7-bitist rühmitust (mõned õpikunäited ja vanemad süsteemid teevad seda endiselt) ja sa dekodeerid seda 8-bitiste baitidena, tuleb iga üksik märk nihutatult välja — rühmituse piir on vale juba esimesest bitist alates, nii et rikkumine on ühtlane kogu väljundis, mitte ei alga puhtalt ja rikne kuskil hiljem.

Tunnus: kui sõna otseses mõttes iga märk väljundis on vale, mitte ainult mõned, kontrolli enne kõike muud bitirühmituse eeldust.

Põhjus 2: liigne või puuduv bitt nihutab kõike sellest edasi

See on binaarne vaste paaritule hex-numbrile — üks eksinud 0 või 1 (lisamärk kopeeri-kleebi tõttu, kadunud number, tühik, mis parsiti andmena) nihutab baidipiiri iga sellest punktist edasise rühma jaoks. Erinevalt põhjusest 1 annab see teksti, mis on korrektne kuni teatud punktini ja moondub pärast seda — tugev signaal, et bittide arv ise on kuskil stringis vale, mitte kogu kodeerimisskeem on läbivalt vale.

Loe kõigepealt bittide koguarv üle: stringi pikkus peaks olema puhas kordne 8-st (või 7-st, kui oled kinnitanud, et see on kasutuses olev rühmitus). Kui ei ole, on lisa- või puuduv bitt viga, mitte dekooder.

Põhjus 3: märgikodeering, täpselt nagu hexi puhul

Kui bitid on korrektselt baitideks rühmitatud, pead siiski otsustama, mida need baidiväärtused märkidena tähendavad — UTF-8, ASCII, Latin-1. See on identne hex-tekst juhtumiga: mitmebaidised UTF-8 märgid (rõhumärkidega tähed, sümbolid, mitteladina kirjad), mis dekodeeritakse baidi kaupa, justkui oleks iga bait oma märk, annavad kahe-kolme moondunud sümboli ühe õige märgi asemel. Kui bitirühmitus on kinnitatud korrektsena (põhjused 1 ja 2 välistatud) ja väljund on siiski konkreetselt mitte-ASCII märkide ümber vale, on see peaaegu alati ülejäänud põhjus.

Põhjus 4: baidijärjekord binaari puhul, mis esindab numbreid, mitte teksti

Kui binaarstring kodeerib arvväärtuse, mitte märgiandmeid — pikkuse eesliide, kontrollsumma, ID tekstisse põimituna —, siis loeb biti-/baidijärjekord ja pole ühtki universaalset vaikeväärtust. 00000001 üksiku baidina on üheselt mõistetav, aga mitmebaidised arvväärtused võivad olla salvestatud kõige olulisema baidiga ees või kõige vähem olulise baidiga ees, sõltuvalt süsteemist, mis need tootis, ning vale eeldusega lugemine annab vaikselt teistsuguse, usutavalt näiva vale numbri, mitte ilmset viga.

Diagnostika järjekorras

  1. Kontrolli, et bittide koguarv on eeldatava rühmituse (tavaliselt 8) puhas kordne — vale arv tähendab põhjust 2, paranda sisend.
  2. Kui iga märk on juba algusest peale ühtlaselt vale, kahtlusta rühmituse suurust ennast (põhjus 1), enne kui puudutad kodeeringut.
  3. Kui väljund on alguses puhas ja rikneb kuskil keskel, viitab see eksinud/puuduvale bitile just selles kohas (põhjus 2), mitte kodeerimisprobleemile.
  4. Kui rühmitus ja bittide arv mõlemad kontrollitud ning ainult mitte-ASCII märgid näevad valed välja, on see märgikodeering (põhjus 3).
  5. Kui andmed esindavad numbrit, mitte teksti, ja väärtus näeb usutav, aga vale välja, kontrolli baidijärjekorda (põhjus 4), enne kui eeldad, et teisendusloogika ise on katki.

Nagu hexi puhul, on teisendussamm triviaalne — tegelik viga elab peaaegu alati ühes neist neljast eeldusest, mitte teisendamist teostavas koodis.

← Tagasi blogisse