ASCII85

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 17 septembrie 2016; verificările necesită 14 modificări .

Ascii85 (cunoscut și ca „Base85”) este o formă de codificare a datelor binare cu text dezvoltată de Paul E. Rutter pentru biblioteca btoa. Datorită faptului că 5 caractere ASCII sunt folosite pentru a codifica 4 octeți de date (datele procesate sunt cu ¹⁄₄ mai mari decât originalul când se folosesc caractere ASCII pe 8 biți), se obține o eficiență mai mare decât în ​​cazul uuencode sau Base64 , în care fiecare 3 octeți sunt codați cu 4 caractere (o creștere de ¹⁄₃ în aceleași condiții).

Este folosit în principal în formatele PostScript și Portable Document Format de la Adobe .

Ideea principală

Principala nevoie de codificare a datelor în text provine din nevoia de a transfera date binare folosind protocoalele existente concepute exclusiv pentru transmiterea textului (de exemplu, e-mail). Astfel de protocoale pot fi garantate să transmită numai valori de 7 biți (și să evite utilizarea caracterelor de control ASCII) și pot necesita inserarea unui caracter de sfârșit de linie pentru a limita lungimea liniilor și pentru a permite indentarea spațiului alb. Aceasta lasă doar 94 de caractere imprimabile care pot fi utilizate.

4 octeți pot conține 232 = 4294967296  valori distincte. 5 cifre în baza 85 oferă 855  = 4437053125 valori distincte, ceea ce este suficient pentru a reprezenta fără ambiguitate valorile pe 32 de biți. Cinci cifre din baza 84 pot furniza doar 84 5  = 4.182.119.424 de valori. Prin urmare, 85 este baza minimă a sistemului numeric în care 4 octeți pot fi codificați cu cinci cifre, motiv pentru care a fost ales.

La codificare, împărțim fluxul de date în grupuri de 4 octeți și considerăm fiecare dintre ei ca un număr de 32 de biți, cu octetul mare la început . Prin împărțirea consecutivă la 85 obținem 5 cifre ale sistemului numeric de 85 de arii. În plus, fiecare cifră este codificată cu un caracter ASCII imprimabil și este transmisă în fluxul de ieșire cu ordinea păstrată de la cea mai semnificativă cifră la cea mai puțin semnificativă.

Codificarea unei cifre cu caractere ASCII se realizează prin creșterea cu 33, adică caractere cu coduri de la 33 (" !") la 117 (" u").

Deoarece valorile zero nu sunt atât de rare, de dragul comprimării suplimentare, se face o excepție suplimentară - cei patru octeți zero sunt codificați cu un singur caracter " z" în loc de " !!!!!".

Un grup de caractere care, atunci când sunt decodificate, furnizează o valoare mai mare de 2 32 − 1 (codificat ca " s8W-!") are ca rezultat o eroare de decodare, la fel ca și caracterul " z" din grup. Toate spațiile albe dintre caractere sunt ignorate și pot fi inserate în mod arbitrar pentru o formatare convenabilă.

Singurul dezavantaj al Ascii85 este că textul rezultat va conține caractere (cum ar fi barele oblice și ghilimele) care au semnificații speciale în limbajele de programare și protocoalele text.

btoa

Programul original btoa a fost întotdeauna codificat în grupuri complete (cel din urmă completat cu zerouri) și a prefixat textul rezultat cu șirul „xbtoa Begin” urmat de „xbtoa End” urmat de dimensiunea fișierului sursă (zecimal și hexazecimal) și trei 32 -sume de verificare de biți. Decodorul a folosit informațiile despre lungimea originală pentru a afla câte zerouri de umplutură au fost introduse.

Acest program a acceptat și valoarea specială „ z” pentru a codifica zerouri (0x00000000), precum și „ y” pentru un grup de patru spații (0x20202020).

Adobe

Adobe a adaptat codarea btoa cu unele modificări și a numit-o Ascii85. În special, delimitatorul „ ~>” a fost adăugat pentru a indica sfârșitul șirului codificat și pentru a determina unde să taie șirul decodat pentru a obține lungimea corectă. Acest lucru se face astfel: dacă ultimul bloc conține mai puțin de 4 octeți, atunci acesta este completat cu zero octeți înainte de codare, iar după codare, se elimină atâtea caractere extreme câte zerouri au fost adăugate din ultimii cinci.

În timpul decodării, ultimul bloc este completat la o lungime de 5 cu simbolul „ u” (cod 84), iar după decodare, același număr de octeți sunt șterși (vezi exemplul de mai jos).

Notă: caracterul de umplere nu a fost ales aleatoriu. În Base64, la transcodare, biții sunt pur și simplu regrupați, nici ordinea, nici valorile lor nu se schimbă (biții înalți ai secvenței sursă nu afectează biții inferiori ai rezultatului). Când sunt convertite într-un sistem numeric cu baza 85 (85 nu este o putere de doi), valorile biților înalți ai secvenței inițiale afectează biții mici ai rezultatului (în mod similar la conversia înapoi). Adăugarea unei valori minime (0) la codificare și a unei valori maxime (84) la decodare asigură păstrarea biților înalți.

Într-un bloc de text Ascii85, spațiile și întreruperile de rând pot fi inserate oriunde, inclusiv în interiorul a cinci litere. Ele ar trebui pur și simplu ignorate.

Specificația de la Adobe nu include extensia „ ” ypentru patru spații.

Exemplu

De exemplu, sloganul istoric al Wikipedia ,

Omul se distinge nu numai prin rațiune, ci și prin această pasiune singulară față de alte animale, care este o poftă a minții, care, printr-o perseverență a încântării în generarea continuă și neobosită a cunoașterii, depășește scurta vehemență a oricărei plăceri carnale. .

fiind codificat în Ascii85 arată astfel:

<~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~>
Text M A n ... s u r e
ASCII 77 97 110 32 ... 115 117 114 101
reprezentare binară 0 unu 0 0 unu unu 0 unu 0 unu unu 0 0 0 0 unu 0 unu unu 0 unu unu unu 0 0 0 unu 0 0 0 0 0 ... 0 unu unu unu 0 0 unu unu 0 unu unu unu 0 unu 0 unu 0 unu unu unu 0 0 unu 0 0 unu unu 0 0 unu 0 unu
reprezentare zecimală 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 reprezentare (+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

Deoarece ultimele patru nu sunt complete, trebuie să le „terminăm” cu zerouri:

Text . \0 \0 \0
ASCII 46 0 0 0
reprezentare binară 0 0 unu 0 unu unu unu 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
reprezentare zecimală 771 751 936 = 14x85 4 + 66x85 3 + 56x85 2 + 74x85 + 46
85 reprezentare (+33) 14 (47) 66 (99) 56 (89) 74 (107) 46 (79)
ASCII / c Y k O

Am adăugat 3 octeți la codificare și trebuie să eliminăm ultimele trei caractere „YkO” din rezultat.

Decodificarea este absolut simetrică, cu excepția ultimelor cinci, pe care le „terminăm” cu caractere „u”:

ASCII / c u u u
85 reprezentare (+33) 14 (47) 66 (99) 84 (117) 84 (117) 84 (117)
reprezentare zecimală 771 955 124 = 14×85 4 + 66×85 3 + 84×85 2 + 84×85 + 84
reprezentare binară 0 0 unu 0 unu unu unu 0 0 0 0 0 0 0 unu unu 0 0 0 unu unu 0 0 unu unu 0 unu unu 0 unu 0 0
ASCII 46 3 25 180
Text . [ ETX ] [EM] nu este definit în ASCII

Deoarece am adăugat 3 „u”, trebuie să scoatem ultimii 3 octeți din rezultat. Ca rezultat, primim un mesaj cu lungimea inițială.

Exemplul original nu avea un cvartet de octeți nuli, așa că nu am văzut „z” prescurtat în rezultat.

Compatibilitate

Codificarea Ascii85 este compatibilă atât cu MIME pe 7 biți, cât și pe 8 biți , dar vine cu mai puțin spațiu decât Base64 .

Singura problemă potențială este că Ascii85 poate conține caractere care trebuie să fie evadate în limbaje de marcare precum XML sau SGML , cum ar fi ghilimele simple și duble, paranteze unghiulare, ampersand (" '"<>&").

Glumă RFC 1924 pentru scrierea adreselor IPv6

Publicat la 1 aprilie 1996, RFC 1924 informativ : „A Compact Representation of IPv6 Addresses” propune codificarea adreselor IPv6 ca numere în baza 85 (base-85, similar cu baza-64). Această propunere diferă de schemele de mai sus prin faptul că, în primul rând, folosește un set de alte 85 de caractere ASCII și, în al doilea rând, tratează întregul grup de 128 de biți ca un singur număr, transformându-l în 20 de caractere finale și nu în grupuri. de 32 de biți. De asemenea, spațiile nu sunt permise.

Set de caractere sugerat, în ordinea crescătoare a codurilor: 0- 9, A- Z, a- zși încă 23 de caractere !#$%&()*+-;<=>?@^_`{|}~. Cea mai mare valoare care se încadrează în 128 de biți ai unei adrese IPv6 este 2 128 −1 = 74×85 19  + 53×85 18  + 5×85 17  + …, are forma =r54lj&NUUO~Hi%c2ym0.

Setul de caractere este ales pentru a evita utilizarea celor mai problematice caractere ( "',./:[]\) care trebuie să fie eliminate în unele protocoale, cum ar fi JSON. Dar acest set conține încă caractere care trebuie să fie eliminate în protocoalele SGML, cum ar fi XML.

Vezi și

Link -uri