Base91 kódolás / dekódolás

Szöveg vagy bináris bájtok átalakítása basE91-gyel: 2 nyomtatható karakterenként 13 bit bemenet, így ez a mindennapi nyomtatható kódolások legsűrűbbike — kb. 23% többlet a Base64 33%-ával szemben. A szöveg UTF-8 bájtként kezelődik; bináris adatokhoz van hexadecimális bájtmód. Még: Base64 | Base32 / Base58 | Ascii85.
Minden feldolgozás helyben, a böngészőben történik — az adatok soha nem töltődnek fel szerverre.

Ha a Base91 fogalma új, Mi a Base91 — egyszerű nyelven elmagyarázva (kidolgozott példával, az ábécével és a csapdákkal).
Működés: A bemenet bájtokká alakul, majd 13 bites csoportokba csomagolódik, amelyek mindegyike két karakterré válik; ahol a rövid forma kétértelmű volna, 14 bites csoport áll.
A bemenet:
Működés: A szóközök figyelmen kívül maradnak, minden karaktert az oldalon lentebb kiírt ábécében keresnek. Az ismeretlen karakter a pozíciójával együtt jelentődik.
A kimenet formátuma:
A Ctrl+Enter a bemenetben futtatja az aktív módot.
A Kódolás vagy a Dekódolás választható, a művelet a műveleti gombbal indítható. Az önteszt 130 kódolási/dekódolási oda-vissza átalakítást futtat, és az eredményszámot itt jelenti.
Az ábécé teljes kiírásban: A Base91-nek nincs szabványügyi testülete, ezért az ábécé nincs garantálva a megvalósítások között. Az oldal a referenciaimplementáció ábécéjét használja, és az alábbi értékek mindegyike pontosan a táblázatban felsorolt 91 karakterrel készült.
A zöld cellák olyan karakterek, amelyek biztonságban állhatnak HTML-szövegben vagy URL-lekérdezésben; a narancssárgákat escapelni vagy százalékkódolni kell (részletek: a táblázat alatti megjegyzéseket).
A zöld cellák olyan karakterek, amelyek biztonságban állhatnak HTML-szövegben vagy URL-lekérdezésben; a narancssárgákat escapelni vagy százalékkódolni kell (részletek: a táblázat alatti megjegyzéseket).
Mért méretek ugyanezen a 92 bájtos bemeneten:
Az itt mért karakterszámok a sztringen. A Base91 nyer, mert 912 = 8281 lefedi a 13 bit 8192 értékét, míg a Base64 4 karaktert használ csupán 24 bitre.
Mi a Base91?

A Base91 tetszőleges bájtok írásának módja, kizárólag nyomtatható ASCII-karakterekkel, ugyanazt a feladatot végzi, mint a Base64, de karakterenként több bitet illeszt bele. Ahelyett, hogy a bemenetet 6 bites csoportokra vágná és csoportonként egy karaktert írna, addig gyűjti a biteket, amíg legalább 13 nincs, majd két karaktert ír, amelyek együtt megnevezik ennek a 13 (vagy 14) bitnek az értékét.

A 91 karakteres ábécé két karaktere 91 × 91 = 8281 különböző értéket nevezhet meg, és 213 = 8192, így két karakter mindig elfér 13 bitben — 89 értékkel a tartalék. Ez a teljes trükk: 2 karakterenként 13 bit, karakterenként 6,5 bit, szemben a Base64 6 bitjével, és kb. 23% többletet ad 33% helyett.

A 30 másodperces változat: a test fPNKd-vé, a Hello, World! pedig >OwJh>}AQ;r@@Y?F-fá lesz. A dekódolás pontosan fordított, és ugyanazt a 91 karakteres ábécét igényli — más ábécé ugyanazokból a bájtokból más kimenetet ad.
Honnan származik a 13 és a 14 bit

91 × 91 = 8281 értéket nevezhet meg egy karakterpár, ami több, mint 213 = 8192, de kevesebb, mint 214 = 16384. Így egy karakterpár mindig hordozhat 13 bitet, néha 14-et. A kódoló először 13 bitet próbál: ha a 13 bites érték nagyobb 88-nál, ezt az értéket két karakterként írja ki; különben veszi a 14. bitet, és az így kapott 14 bites értéket írja ki.

A 88-as határ nem önkényes. A legnagyobb érték, amelyet két karakter megnevezhet, 90 + 91 × 90 = 8280, és a 8192 + 89 = 8281 már ezen túl van. Így egyetlen 14 bites csoport alacsony 13 bites ablaka sem lehet 89 vagy nagyobb, ami azt jelenti, hogy a dekódoló a két esetet pusztán az értékből meg tudja különböztetni:

Amit a dekódoló látFelhasznált bitekMiért
value & 8191 89 és 8191 között13 bit89-től felfelé csak a 13 bites ágból jöhet, mert egy ilyen magas alacsony 13 bites ablakú 14 bites csoport legalább 8281 lenne — amit két karakter sem tud megnevezni.
value & 8191 0 és 88 között14 bitA kódoló csak akkor tér vissza 14 bitre, ha a 13 bites olvasat 88 vagy kisebb volt, így ez az ág a tartalék, és semmi más.

A végén maradó bármi — 1-től 13 bitig — egy karakterként íródik ki, plusz egy második karakterrel, ha a maradéknak valóban több mint 7 bitre volt szüksége. Ezért nő a kódolt hossz két karakterenként, és néha páratlan számra végződik.

Az ábécé, és a három karakter, amelyet kihagy

A nyomtatható ASCII 94 karaktert tartalmaz, a ! (0x21) és a ~ (0x7E) között. A Base91 ezek közül 91-et használ, a kihagyott három pedig a kötőjel -, az aposztróf ' és a fordított perjel \. A betűk, számjegyek és majdnem minden írásjel pontosan egyszer szerepel az ábécében, a fenti táblázatban látható sorrendben; a 92.–94. nyomtatható karakter egyszerűen nem címezhető.

Mivel az ábécé rögzített sorrend, egy érték karaktere keresés, nem képlet. Két megvalósítás, amely másképp rendezi az ábécét, mindkettő „Base91” lesz, és nem tudják egymás kimenetét olvasni - ez a zavaros eredmények leggyakoribb egyedüli forrása. Az oldal kiírja az ábécéjét, így a kimenet mindig visszavezethető rá.

A Base91 a többi nyomtatható kódolás mellett
KódolásBit karakterenkéntMéret a bemenethez képestMegjegyzések
Base16 (hex)4200%Bájtonként két karakter, könnyen olvasható, nincs keresendő ábécé.
Base325160%Kis- és nagybetű-érzéketlen és emberi diktálásra alkalmas, de a csoport legpazarlóbbja.
Base58~5,86~137%Címekhez választva, nem sűrűségért: elkerüli a hasonló karaktereket.
Base646133%Mindenütt az alapértelmezett: 4 karakter 3 bájtonként, az utolsó karakter fel nem használt 6 bitje elvész.
Ascii85 / Base856,4125%5 karakter 4 bájtonként, nincs szükség keresőtáblára, de 85-tel oszt — részletek: az Ascii85 átalakítót.
Base91~6,5~123%Ezek közül a legsűrűbb: 2 karakterenként 13 bit, néha egy 14 bites csoport árán.

A százalékok az egyes kódolások aszimptotikus költségei, kerekítve; egy valódi, 92 bájtos bemenet mért karakterszámai az oldal fenti táblázatában találhatók. A Base91 közel van ahhoz, amit nyomtatható ASCII-val bármely kódolás elérhet: karakterenként 7 bit 128 különböző karaktert jelentene, amit a nyomtatható tartomány nem tud biztosítani.

Mi nem a Base91
  • Nem szabvány. Nincs RFC. A referenciaimplementáció a basE91 0.6.0, Joachim Henke munkája, BSD 3 pontos licenc alatt; a „Base91” nevet ettől eltérő ábécékre is használják.
  • Nem titkosítás. Minden karakter a bemeneti bitek egyenes átrendezése, és aki ismeri az ábécét, egy menetben visszafordíthatja.
  • Nem URL-biztos. Az ábécé tartalmazza a #, %, &, /, ? és " karaktereket, amelyek URL-ben jelentést változtatnak, ezért a Base91-kimenetet lekérdezési sztringbe kerülés előtt százalékkódolni kell.
  • Nem HTML-biztos. Tartalmazza a <, >, & és " karaktereket is, ezért a Base91-sztringet jelölőnyelvbe illesztés előtt escapelni kell a HTML-entitás átalakítóval.
  • Nem fix hosszúságú. A kimenet hossza a bitmintától függ, nem csak a bájtszámtól, ezért két azonos méretű bemenet egy karakterrel eltérhet.
Valóban csapdába ejtő buktatók
  • Az ábécé ezen az oldalon a referenciaábécé. Ha egy másik eszköz ugyanarra a bemenetre más kimenetet ad, az ábécéjét érdemes összevetni, mielőtt bármelyik oldalt elrontottnak tekintenénk. A 91 karakternek ugyanabban a sorrendben kell szerepelnie.
  • Egyetlen rossz karakter az egész farkát megváltoztathatja. A csoporthatárokat a korábbi értékek döntik el, így a sztring elején lévő szerkesztés minden utána következőt eltol, a farok pedig csak az utolsó csoport maradék bitjeivel dekódolódik.
  • A páratlan kimeneti hossz normális. Nem jelenti azt, hogy a sztring el lett vágva; az utolsó csoport akkor ír egy karaktert, ha a maradék értéke 7 bitbe vagy kevesebbe fér.
  • Egy közzétett példa olyan sortörést tartalmazhat, amelyet nem gépelt be. Egy parancssori művelet, amely sorvéget ad hozzá, a jól ismert Base91-érték egy karakterrel hosszabb lehet, mint az ugyanazt a szöveget itt adó kimenet: az echo "Hello, World!" 14 bájtot ad a kódolónak, és >OwJh>}AQ;r@@Y?FF-et ír ki, míg a puszta szöveg 13 bájtja >OwJh>}AQ;r@@Y?F-et. Mindkettő helyes, más bájtszámra, és a kimeneti doboz alatti szám megmondja, melyiket tartja.
  • Bináris adat szövegként való dekódolása nem fog működni. Ha a dekódolt bájtok nem érvényes UTF-8-ak, nincs értelmes szöveg, amelyet meg lehetne jeleníteni; erre való a hexadecimális kimeneti mód.
Gyors válaszok

„Miért ad az oldal egy karakterrel eltérő értéket egy másik Base91-eszközhöz képest?”

Szinte mindig másik ábécé. A második leggyakoribb ok egy olyan eszköz, amely csak a 13 bites ágat használja, a 14 bites tartalék-ágat sosem; ez a változat kódban kisebb, de az itt használt referenciaalgoritmustól eltérő kimenetet ad.

Van egy pontos eset is, amelyet bájtok számlálásával lehet eldönteni, és ez magyarázza a legszélesebb körben idézett példát: a záró sortörést. A közzétett vektorok többségét parancssori művelet állította elő, a parancssor pedig hozzáadja a sort lezáró sorvéget. A Hello, World! 13 bájtja itt 16 karaktert ír ki, míg a Hello, World! plusz sortörés 14 bájtja a 17 karakteres >OwJh>}AQ;r@@Y?FF-et. Bármelyik értéket beillesztve a Dekódolásba az oldal jelzi a bájtszámot, így a két olvasat megkülönböztethető, nem vitatható. A Minta gomb a két érték közül azt tölti be, amely a használt olvasóhoz tartozik, és követi a Kódolás / Dekódolás kapcsolót és a Bemenet / Kimenet formátuma választót: a szöveges olvasó a 16 karakteres értéket kapja, a hexadecimális olvasó a 17 karakterest záró 0A bájtjával együtt láthatóan, a kódoló pedig a kódolandó szöveget, nem Base91-sztringet.

„Kisebb a Base91, mint a Base64?”

Igen, a kódolt méret kb. 8%-ával: 2 karakterenként 13 bit szemben a karakterenkénti 6 bittel. 92 bájt szövegen a Base64 124 karaktert, a Base91 114-et ír ki.

„Dekódolható ez Base64-dekódolóval, vagy fordítva?”

Nem. Az ábécék a betűkben és számjegyekben átfednek, ezért egy Base64-dekódoló a Base91-sztringet „érvényes” karakterekként elfogadja, és csendes szemetet állít elő. A kettő csak a séma alakjában egyezik.

„A kimenet kitöltéssel végződik, mint a Base64?”

Nem. A Base91-nek nincs kitöltőkaraktere: a végén maradó bitek utolsó csoportként íródnak ki, így semmit nem kell hozzáadni vagy eltávolítani.

„Honnan tudható, hogy az oldal eredménye helyes?”

A 0–64 bájtos önteszt gomb minden olyan hosszt lefedő 130 bájtmintát kódol és dekódol, ahol a 13 és 14 bites felosztás változik, és összeveti a visszakapott bájtokat a bemenetiekkel. A Minta gomb vektorai ezenfelül egy második, a webhely tesztelőeszközéhez írt megvalósítással is keresztellenőrzöttek.

Szabványok és hivatkozások

Az oldal a basE91 referenciaimplementáció (0.6.0 verzió) algoritmusát valósítja meg, Joachim Henke munkájaként, BSD 3 pontos licenc alatt, a fent kiírt ábécével. A dekódolás a szóközöket elfogadja és figyelmen kívül hagyja, ahogy a referenciaeszköz is.

Az oldal szövegét ehhez a webhelyhez írták; az algoritmus nem máshonnan lett átmásolva. A Minta gomb értékei a referenciacsomag egyetlen szállított példája („referenciapélda” jelöléssel), valamint egy második, független megvalósítás által előállított értékek („keresztellenőrzés” jelöléssel), amelyet a webhely tesztelőeszközei között tartanak.