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át | Felhasznált bitek | Miért |
| value & 8191 89 és 8191 között | 13 bit | 89-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ött | 14 bit | A 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ás | Bit karakterenként | Méret a bemenethez képest | Megjegyzések |
| Base16 (hex) | 4 | 200% | Bájtonként két karakter, könnyen olvasható, nincs keresendő ábécé. |
| Base32 | 5 | 160% | 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. |
| Base64 | 6 | 133% | Mindenütt az alapértelmezett: 4 karakter 3 bájtonként, az utolsó karakter fel nem használt 6 bitje elvész. |
| Ascii85 / Base85 | 6,4 | 125% | 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.