Mikä on Base91?
Base91 on tapa kirjoittaa mielivaltaisia tavuja pelkillä tulostettavilla ASCII-merkeillä - sama tehtävä kuin Base64:llä, mutta se mahtuu enemmän bittejä jokaiseen merkkiin. Sen sijaan, että syöte pilkotaan 6 bitin ryhmiin ja tulostetaan yksi merkki ryhmää kohden, se kerää bittejä, kunnes niitä on vähintään 13, ja tulostaa sitten kaksi merkkiä, jotka yhdessä nimeävät näiden 13 (tai 14) bitin arvon.
Kahdella merkillä 91 merkin aakkostosta voi nimetä 91 × 91 = 8281 eri arvoa, ja 213 = 8192, joten kaksi merkkiä mahtuu aina 13 bittiä — 89 arvon varalla. Siinä koko temppu: 13 bittiä kahta merkkiä kohden on 6,5 bittiä merkkiä kohden, Base64:n 6 bittiä vastaan, ja se antaa noin 23% lisäkustannuksen 33%:n sijaan.
30 sekunnin versio: test muuttuu muotoon fPNKd, ja Hello, World! muuttuu muotoon >OwJh>}AQ;r@@Y?F. Dekoodaus on täsmälleen päinvastainen ja tarvitsee saman 91 merkin aakkoston — eri aakkosto antaa samoista tavuista eri tuloksen.
Mistä 13 ja 14 bittiä tulevat
Pari merkkejä voi nimetä 91 × 91 = 8281 arvoa, mikä on enemmän kuin 213 = 8192 mutta vähemmän kuin 214 = 16384. Pari merkkejä voi siis aina kantaa 13 bittiä ja joskus 14. Kooderi yrittää ensin 13 bittiä: jos 13 bitin arvo on suurempi kuin 88, se tulostaa arvon kahtena merkkinä; muuten se ottaa 14. bitin ja tulostaa tuloksena olevan 14 bitin arvon.
Raja 88 ei ole mielivaltainen. Suurin arvo, jonka kaksi merkkiä voi nimetä, on 90 + 91 × 90 = 8280, ja 8192 + 89 = 8281 on jo sen yli. Joten yksikään 14 bitin ryhmä ei voi koskaan antaa matalaa 13 bitin ikkunaa, joka olisi 89 tai enemmän, mikä tarkoittaa, että dekooderi voi erottaa kaksi tapausta katsomalla vain arvoa itseään:
| Mitä dekooderi näkee | Kulutetut bitit | Miksi |
| arvo & 8191 on 89-8191 | 13 bittiä | 89 ja sen yli voi tulla vain 13 bitin haarasta, koska 14 bitin ryhmän matala 13 bitin ikkuna näin korkealla vaatisi vähintään 8281 — mitä mikään kahden merkin pari ei voi nimetä. |
| arvo & 8191 on 0-88 | 14 bittiä | Kooderi putoaa 14 bittiin vain, kun 13 bitin luku oli 88 tai vähemmän, joten tämä haara on varahaara eikä mikään muu. |
Lopussa jäljelle jäävä — mikä tahansa 1-13 bittiä — tulostuu yhtenä merkkinä, ja toisena merkkinä, jos jäänteen oikeasti tarvitsi enemmän kuin 7 bittiä. Siksi koodatun pituus kasvaa kahden merkin askelin ja päättyy joskus parittomaan määrään.
Aakkosto ja kolme merkkiä, jotka se pudottaa pois
Tulostettavassa ASCII:ssa on 94 merkkiä, ! (0x21) ja ~ (0x7E) välillä. Base91 käyttää niistä 91, ja kolme jätettävää ovat väliviiva -, heittomerkki ' ja kenoviiva \. Kirjaimet, numerot ja melkein kaikki välimerkit ovat aakkostossa tasan kerran, yllä olevan taulukon järjestyksessä; tulostettavat merkit 92-94 eivät ole yksinkertaisesti osoitettavissa.
Koska aakkosto on kiinteä järjestys, arvon merkki on hakutaulukko eikä kaava. Kaksi toteutusta, jotka järjestävät aakkoston eri tavoin, ovat molemmat "Base91" eivätkä pysty lukemaan toistensa tulosta, mikä on yksittäinen yleisin hämmentävien tulosten lähde. Tämä sivu tulostaa aakkostonsa, jotta tulos voidaan aina jäljittää siihen.
Base91 muiden tulostettavien koodausten rinnalla
| Koodaus | Bittejä merkkiä kohden | Koko suhteessa syötteeseen | Huomautukset |
| Base16 (heksa) | 4 | 200% | Kaksi merkkiä tavua kohden, helppolukuinen, ei aakkostoa katsottavaksi. |
| Base32 | 5 | 160% | Kirjainkoosta riippumaton ja turvallinen sanelulle, mutta ryhmän hukkaavin. |
| Base58 | ~5,86 | ~137% | Valittu osoitteisiin, ei tiheyteen: se välttää sekoitettavia merkkejä. |
| Base64 | 6 | 133% | Oletus kaikkialla: 4 merkkiä 3 tavua kohden, viimeisen merkin 6 käyttämätöntä bittiä menevät hukkaan. |
| Ascii85 / Base85 | 6,4 | 125% | 5 merkkiä 4 tavua kohden, ei tarvita hakutaulukkoa, mutta se jakaa 85:llä — katso Ascii85-muunnin. |
| Base91 | ~6,5 | ~123% | Näistä tihein: 13 bittiä kahta merkkiä kohden, hintana silloin tällöin 14 bitin ryhmä. |
Prosentit ovat kunkin koodauksen asymptoottisia kustannuksia, pyöristettyinä; yhden oikean 92 tavun syötteen mitatut merkkimäärät ovat tämän sivun taulukossa edempänä. Base91 on lähellä parasta, mitä mikään koodaus voi tulostettavalla ASCII:lla tehdä: 7 bittiä merkkiä kohden vaatisi 128 eri merkkiä, joita tulostettava alue ei tarjoa.
Mitä Base91 ei ole
- Ei standardi. Ei ole RFC:tä. Viitetoteutus on basE91 0.6.0, Joachim Henken tekemä, julkaistu BSD 3 -lausekkeen lisenssillä; "Base91"-nimeä käytetään myös aakkostoille, jotka eivät ole tämä.
- Ei salausta. Jokainen merkki on suora syötebittien uudelleenmuotoilu, ja kuka tahansa aakkoston tuntija kääntää sen yhdellä kierroksella.
- Ei URL-turvallinen. Aakkosto sisältää merkit
#, %, &, /, ? ja ", jotka kaikki muuttavat merkitystään URL-osoitteessa, joten Base91-tulos on prosenttikoodattava ennen kuin se laitetaan kyselymerkkijonoon.
- Ei HTML-turvallinen. Se sisältää myös merkit
<, >, & ja ", joten Base91-merkkijono, joka sijoitetaan merkintäkieleen, on escapoitava HTML-entiteettimuuntimella.
- Ei kiinteä pituus. Tuloksen pituus riippuu bittikuviosta eikä pelkästään tavumäärästä, joten kaksi samankokoista syötettä voi tulostua yhden merkin erolla.
Todelliset sudenkuopat
- Tämän sivun aakkosto on viitteen aakkosto. Jos toinen työkalu tuottaa eri tuloksen samalle syötteelle, vertaa sen aakkostoa ennen kuin oletat, että jompikumpi on rikki. 91 merkin on esiinnyttävä samassa järjestyksessä.
- Yksi väärä merkki voi muuttaa koko hännän. Ryhmärajat päätetään aiempien arvojen perusteella, joten muokkaus merkkijonon alussa siirtää kaiken sen jälkeen, ja hännän dekoodaus käyttää vain viimeisen ryhmän jäljelle jääneitä bittejä.
- Pariton tuloksen pituus on normaali. Se ei tarkoita, että merkkijono katkaistiin; viimeinen ryhmä tulostaa yhden merkin, kun sen jäänteen arvo mahtuu 7 bittiin tai vähempään.
- Julkaistu esimerkki voi sisältää rivinvaihdon, jota et kirjoittanut. Komento, joka lisää rivinloppumerkin, on yleisin syy siihen, miksi tunnettu Base91-arvo on yhden merkin pidempi kuin sama teksti tuottaa täällä:
echo "Hello, World!" antaa kooderille 14 tavua ja tulostaa >OwJh>}AQ;r@@Y?FF, kun pelkkä teksti 13 tavulla tulostaa >OwJh>}AQ;r@@Y?F. Molemmat ovat oikein, eri tavumäärille, ja tulosruudun alla oleva määrä kertoo, kumpaa pidät.
- Binääridatan dekoodaaminen tekstiksi ei onnistu. Jos dekoodatut tavut eivät ole kelvollista UTF-8:aa, niistä ei ole järkevää tekstiä näytettäväksi - siihen heksatulostustila on olemassa.
Pikavastaukset
“Miksi tämä sivu näyttää arvon, joka on yhden merkin erilainen kuin toisen Base91-työkalun tulos?”
Melkein aina eri aakkosto. Toiseksi yleisin syy on työkalu, joka käyttää vain 13 bitin haaraa eikä koskaan 14 bitin varahaaraa; se muunnos on koodissa pienempi mutta tuottaa eri tulosta kuin tässä käytetty viitealgoritmi.
On myös yksi tarkka tapaus, joka ratkeaa tavujen laskemisella, ja se selittää laajimmin siteeratun esimerkin: lopussa olevan rivinvaihdon. Useimmat julkaistut vektorit on tuotettu komentorivillä, ja komentorivi lisää rivin päättävän rivinvaihdon. Hello, World!-merkkijonon 13 tavua tulostuvat tässä 16 merkkinä, kun taas saman Hello, World!-merkkijonon 14 tavua rivinvaihdon kanssa tulostuvat 17 merkkinä >OwJh>}AQ;r@@Y?FF. Liitä kumpi tahansa arvo Dekoodaukseen: tämä sivu ilmoittaa tavumäärän, joten kaksi lukua voi erottaa eikä niistä tarvitse kiistellä. Esimerkki-painike lataa sen kahdesta, joka kuuluu lukijaan, jota käytät; se seuraa Koodaa/Dekoodaa-vaihtoa ja Syöte on / Tulos muodossa -valitsinta: tekstilukija saa 16 merkin arvon, heksalukija 17 merkin arvon sen lopun 0A-tavun näkyessä selvästi, ja kooderi saa koodattavan tekstin eikä Base91-merkkijonoa.
“Onko Base91 pienempi kuin Base64?”
Kyllä, noin 8% koodatusta koosta: 13 bittiä kahta merkkiä kohden vastaan 6 bittiä merkkiä kohden. 92 tavulla tekstiä Base64 tulostaa 124 merkkiä ja Base91 tulostaa 114.
“Voinko dekoodata tämän Base64-dekooderilla tai päinvastoin?”
Ei. Aakkostot menevät päällekkäin kirjaimissa ja numeroissa, joten Base64-dekooderi hyväksyy Base91-merkkijonon "kelvollisina" merkkeinä ja tuottaa hiljaa roskaa. Ne ovat samaa mieltä vain järjestelmän muodosta.
“Päättyykö tulos täytteeseen kuten Base64?”
Ei. Base91:llä ei ole lainkaan täytemerkkiä: lopussa jäljelle jäävät bitit tulostetaan viimeisenä ryhmänä, joten mitään ei tarvitse lisätä tai poistaa.
“Miten tiedän, että tämän sivun tulos on oikein?”
Paina Itsetesti 0-64 tavua. Se koodaa ja dekoodaa 130 tavukuviota, jotka kattavat jokaisen pituuden, jolla 13 ja 14 bitin jako muuttuu, ja vertaa takaisin tulleita tavuja sisään menneisiin. Esimerkki-painikkeen arvot tarkistetaan lisäksi toista riippumatonta toteutusta vastaan, joka on kirjoitettu tämän sivuston testityökaluihin.
Standardit ja tekijyys
Tämä sivu toteuttaa basE91-viitetoteutuksen (versio 0.6.0), jonka on tehnyt Joachim Henke ja joka on jaettu BSD 3 -lausekkeen lisenssillä, yllä tulostetulla aakkostolla. Dekoodaus hyväksyy ja ohittaa välilyönnit, kuten viitetyökalukin.
Sivun teksti on kirjoitettu tälle sivustolle; algoritmia ei ole kopioitu mistään. Esimerkki-painikkeen arvot ovat yksi esimerkki, joka tulee viitepaketin mukana (merkitty "viitteen esimerkki"), sekä arvot, jotka tuotti toinen, riippumaton toteutus tämän sivuston testityökaluissa (merkitty "ristitarkistus").