ASCII85

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2016. szeptember 17-én felülvizsgált verziótól ; az ellenőrzések 14 szerkesztést igényelnek .

Az Ascii85 (más néven "Base85") a bináris adatok szöveges kódolásának egyik formája, amelyet Paul E. Rutter fejlesztett ki a btoa könyvtár számára. Tekintettel arra, hogy 5 ASCII karaktert használnak 4 bájt adat kódolására (a feldolgozott adat ¹⁄₄-kal nagyobb, mint az eredeti 8 bites ASCII karakterek használata esetén), nagyobb hatékonyság érhető el, mint az uuencode vagy a Base64 esetében, amelyben minden 3 bájt 4 karakterrel van kódolva (ugyanolyan feltételek mellett ¹⁄₃ növekedés).

Főleg az Adobe PostScript és Portable Document Format formátumaiban használják .

Fő ötlet

Az adatok szövegben történő kódolásának fő igénye abból adódik, hogy bináris adatokat kell továbbítani meglévő, kizárólag szövegátvitelre tervezett protokollok (például e-mail) használatával. Az ilyen protokollok garantáltan csak 7 bites értékeket adnak át (és elkerülik az ASCII vezérlőkarakterek használatát), és szükség lehet egy sorvégi karakter beszúrására a sorok hosszának korlátozása és a szóközök behúzásának engedélyezése érdekében. Így már csak 94 nyomtatható karakter marad.

4 bájt 232 = 4294967296  különböző értéket tartalmazhat. A 85-ös alap 5 számjegye 855  = 4437053125 különböző értéket ad, ami elegendő a 32 bites értékek egyértelmű megjelenítéséhez. A 84-es alap öt számjegye csak 84 5  = 4 182 119 424 értéket adhat. Ezért a 85 a számrendszer minimális alapja, amelyben 4 bájt öt számjeggyel kódolható, ezért esett a választás.

A kódolás során az adatfolyamot 4 bájtos csoportokra osztjuk, és mindegyiket 32 ​​bites számnak tekintjük, a magas bájttal az elején . 85-tel egymást követő osztással a 85-ös számrendszer 5 számjegyét kapjuk. Továbbá minden számjegy nyomtatható ASCII karakterrel van kódolva, és a kimeneti adatfolyamba kerül a legjelentősebb számjegytől a legkevésbé jelentősig tartó sorrendben.

A számjegy ASCII-karakterekkel történő kódolása 33-mal történő növeléssel történik, vagyis a 33-ról (" !") 117-re (" u") rendelkező karakterek kódolásával.

Mivel a nulla értékek nem olyan ritkák, a további tömörítés érdekében további kivételt teszünk - a nulla négy bájt egyetlen " " karakterrel van kódolva a " z" helyett !!!!!.

Olyan karaktercsoport, amely dekódoláskor 2 32 − 1- nél nagyobb értéket ad (" "-ként kódolva s8W-!), dekódolási hibát eredményez, akárcsak za csoporton belüli " " karakter. A karakterek közötti összes szóközt figyelmen kívül hagyja, és tetszőlegesen beszúrható a kényelmes formázás érdekében.

Az Ascii85 egyetlen hátránya, hogy az eredményül kapott szöveg olyan karaktereket (például perjeleket és idézőjeleket) tartalmaz, amelyek speciális jelentéssel bírnak a programozási nyelvekben és a szöveges protokollokban.

btoa

Az eredeti btoa program mindig teljes csoportokba kódolt (ez utóbbi nullákkal volt kitöltve), és az eredményül kapott szöveg elé az "xbtoa Begin" karakterláncot, majd az "xbtoa End" karakterláncot írta, amelyet a forrásfájl mérete (tizedes és hexadecimális) és három 32 -bit ellenőrző összegek. A dekóder az eredeti hosszinformációkat használta annak megállapítására, hogy hány kitöltési nullát szúrtak be.

Ez a program a " " speciális értéket is támogatta a znullák kódolásához (0x00000000), valamint a " y" négy szóközből álló csoporthoz (0x20202020).

Adobe

Az Adobe néhány változtatással adaptálta a btoa kódolást, és Ascii85-nek nevezte el. Különösen a " ~>" elválasztójelet adták hozzá, hogy jelezze a kódolt karakterlánc végét, és meghatározza, hol kell elvágni a dekódolt karakterláncot a megfelelő hosszúság eléréséhez. Ez a következőképpen történik: ha az utolsó blokk 4 bájtnál kevesebbet tartalmaz, akkor a kódolás előtt nulla bájttal egészül ki, és a kódolás után annyi szélső karakter, amennyi nullát hozzáadott az utolsó ötből, eltávolításra kerül.

A dekódolás során az utolsó blokkot 5-ös hosszúságúra töltjük ki a „ u” szimbólummal (84-es kód), és a dekódolás után ugyanennyi bájt törlődik (lásd a lenti példát).

Megjegyzés: A kitöltési karaktert nem véletlenül választották ki. A Base64-ben az átkódoláskor a bitek egyszerűen átcsoportosításra kerülnek, sem sorrendjük, sem értékük nem változik (a forrássorozat magas bitjei nem befolyásolják az eredmény alacsony bitjeit). 85-ös bázisú számrendszerre konvertálva (a 85 nem a kettő hatványa), az eredeti sorozat magas bitjeinek értékei befolyásolják az eredmény alacsony bitjeit (hasonlóan a visszakonvertálásnál). A minimális érték (0) hozzáadása kódoláskor és egy maximális érték (84) dekódoláskor biztosítja a magas bitek megőrzését.

Egy Ascii85 szövegblokkban szóközök és sortörések bárhol beszúrhatók, beleértve az ötös betűket is. Egyszerűen figyelmen kívül kell hagyni őket.

Az Adobe specifikációja nem tartalmazza a " " kiterjesztést ynégy szóközhöz.

Példa

Például a Wikipédia történelmi szlogenje ,

Az embert nemcsak az esze, hanem ez az egyedülálló szenvedély különbözteti meg a többi állatoktól, ami az elme vágya, amely a tudás folyamatos és fáradhatatlan nemzedékében való gyönyörködtetésével túlszárnyal minden testi élvezet rövid hevességét. .

Az Ascii85 kódolása így néz ki:

<~9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKF<GL>[email protected]$d7F!,L7@<6@)/0JDEF<G%<+EV:2F!, O<DJ+*.@<*K0@<6L(Df-\0Ec5e;DffZ(EZee.Bl.9pF"AGXBPCsi+DGm>@3BB/F*&OCAfu2/AKY i(DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF<G:8+EV:.+Cf>-FD5W8ARlolDIa l(DId<j@<?3r@:F%a+D58'ATD4$Bl@l3De:,-DJs`8ARoFb/0JMK@qB4^F!,R<AKZ&-DfTqBG%G >uD.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c~>
Szöveg M a n ... s u r e
ASCII 77 97 110 32 ... 115 117 114 101
bináris reprezentáció 0 egy 0 0 egy egy 0 egy 0 egy egy 0 0 0 0 egy 0 egy egy 0 egy egy egy 0 0 0 egy 0 0 0 0 0 ... 0 egy egy egy 0 0 egy egy 0 egy egy egy 0 egy 0 egy 0 egy egy egy 0 0 egy 0 0 egy egy 0 0 egy 0 egy
decimális ábrázolás 1 298 230 816 = 24 × 85 4 + 73 × 85 3 + 80 × 85 2 + 78 × 85 + 61 ... 1 937 076 837 = 37 × 85 4 + 9 × 85 3 + 17 × 85 2 + 44 × 85 + 22
85 reprezentáció (+33) 24 (57) 73 (106) 80 (113) 78 (111) 61 (94) ... 37 (70) 9 (42) 17 (50) 44 (77) 22 (55)
ASCII 9 j q o ^ ... F * 2 M 7

Mivel az utolsó négy nem teljes, nullákkal kell „befejeznünk”:

Szöveg . \0 \0 \0
ASCII 46 0 0 0
bináris reprezentáció 0 0 egy 0 egy egy egy 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
decimális ábrázolás 771 751 936 = 14x85 4 + 66x85 3 + 56x85 2 + 74x85 + 46
85 reprezentáció (+33) 14 (47) 66 (99) 56 (89) 74 (107) 46 (79)
ASCII / c Y k O

A kódolás során 3 bájtot adtunk hozzá, és el kell távolítani az utolsó három „YkO” karaktert az eredményből.

A dekódolás abszolút szimmetrikus, kivéve az utolsó ötöt, amit „u” karakterekkel „végezünk”:

ASCII / c u u u
85 reprezentáció (+33) 14 (47) 66 (99) 84 (117) 84 (117) 84 (117)
decimális ábrázolás 771 955 124 = 14 × 85 4 + 66 × 85 3 + 84 × 85 2 + 84 × 85 + 84
bináris reprezentáció 0 0 egy 0 egy egy egy 0 0 0 0 0 0 0 egy egy 0 0 0 egy egy 0 0 egy egy 0 egy egy 0 egy 0 0
ASCII 46 3 25 180
Szöveg . [ ETX ] [EM] nincs definiálva az ASCII-ben

Mivel hozzáadtunk 3 'u-t, le kell vonnunk az utolsó 3 bájtot az eredményből. Ennek eredményeként az eredeti hosszúságú üzenetet kapjuk.

Az eredeti példában nem volt nullbájtokból álló kvartett, így nem láttuk a rövidített „z”-t az eredményben.

Kompatibilitás

Az Ascii85 kódolás kompatibilis a 7 bites és a 8 bites MIME - vel is, ugyanakkor kevesebb helyet foglal, mint a Base64 .

Az egyetlen lehetséges probléma az, hogy az Ascii85 olyan karaktereket tartalmazhat, amelyeket meg kell szabadulni az olyan jelölőnyelvekben, mint az XML vagy az SGML , például szimpla és dupla idézőjelek, szögletes zárójelek, és ( " '"<>&").

Joke RFC 1924 IPv6-címek írásához

Az 1996. április 1-jén közzétett tájékoztató RFC 1924 : "Az IPv6-címek kompakt ábrázolása" az IPv6 -címek számokként való kódolását javasolja a 85-ös bázisban (85-ös, hasonló a 64-es alaphoz). Ez a javaslat abban különbözik a fenti sémáktól, hogy egyrészt egy másik 85 ASCII-karakter halmazát használja, másrészt a teljes 128 bites csoportot egyetlen számként kezeli, 20 végső karakterré alakítva, és nem csoportokban. 32 bites. Ezenkívül nem megengedettek a szóközök.

Javasolt karakterkészlet, a kódok növekvő sorrendjében: 0- 9, A- Z, a- zés további 23 karakter !#$%&()*+-;<=>?@^_`{|}~. A legnagyobb érték, amely egy IPv6-cím 128 bitjébe belefér: 2 128 −1 = 74×85 19  + 53×85 18  + 5×85 17  + …, a következő alakú =r54lj&NUUO~Hi%c2ym0.

A karakterkészlet úgy van megválasztva, hogy elkerülje a legproblémásabb karakterek ( "',./:[]\) használatát, amelyeket egyes protokollokban, például a JSON-ban meg kell szökni. De ez a készlet továbbra is tartalmaz olyan karaktereket, amelyeket meg kell szabadítani az SGML protokollokban, például az XML-ben.

Lásd még

Linkek