Ascii85 - Ascii85

Ascii85 , zwany także Base85 , to forma kodowania binarnego do tekstu opracowana przez Paula E. Ruttera dla narzędzia btoa . Użycie pięciu znaków ASCII do reprezentowania czterech bajtów danych binarnych (co sprawia, że ​​zakodowany rozmiar 14 jest większy niż oryginał, przy założeniu ośmiu bitów na znak ASCII), jest bardziej wydajny niż uuencode lub Base64 , które używają czterech znaków do reprezentowania trzech bajtów danych ( 1 / 3 wzrostu, i odpowiada osiem bitów na znaków ASCII).

Jego główne współczesne zastosowania są w Adobe „s PostScript i Portable Document Format formatów plików, a także w łaty kodowanie dla plików binarnych używanych przez Git .

Przegląd

Podstawowa potrzeba kodowania binarnego na tekst wynika z potrzeby przekazywania dowolnych danych binarnych za pośrednictwem istniejących protokołów komunikacyjnych, które zostały zaprojektowane do przenoszenia tylko tekstu w języku angielskim czytelnym dla człowieka . Te protokoły komunikacyjne mogą być bezpieczne tylko 7-bitowo (w ramach których można uniknąć niektórych kodów kontrolnych ASCII) i mogą wymagać łamania linii w określonych maksymalnych odstępach czasu i mogą nie utrzymywać białych znaków . Zatem tylko 94 drukowalne znaki ASCII są „bezpieczne” w użyciu do przenoszenia danych.

Cztery bajty mogą reprezentować 2 32  = 4 294 967 296 możliwych wartości. Pięć podstaw -85 cyfr daje 85 5  = 4 437 053 125 możliwych wartości, co wystarczy, aby zapewnić unikalną reprezentację dla każdej możliwej 32-bitowej wartości. Ponieważ pięć cyfr o podstawie 84 daje tylko 84 5  = 4 182 119 424 reprezentowalnych wartości, 85 jest minimalną możliwą całkowitą podstawą, która będzie reprezentować cztery bajty w pięciu znakach, stąd jej wybór.

Podczas kodowania każda grupa 4 bajtów jest traktowana jako 32-bitowa liczba binarna, najpierw najbardziej znaczący bajt (Ascii85 używa konwencji big-endian ). Jest to konwertowane, poprzez wielokrotne dzielenie przez 85 i wzięcie reszty, na 5 cyfr-85 radix. Następnie każda cyfra (ponownie, najważniejsza pierwsza) jest kodowana jako drukowalny znak ASCII przez dodanie do niej 33, co daje znaki ASCII od 33 (" !") do 117 (" u").

Ponieważ dane całkowicie zerowe są dość powszechne, robi się wyjątek ze względu na kompresję danych , a grupa całkowicie zerowa jest kodowana jako pojedynczy znak " z" zamiast " !!!!!".

Grupy znaków, które dekodują do wartości większej niż 2 32 − 1 (zakodowane jako " s8W-!") spowodują błąd dekodowania, podobnie jak zznaki " " w środku grupy. Spacje między znakami są ignorowane i mogą wystąpić w dowolnym miejscu, aby uwzględnić ograniczenia długości linii.

Jedną z wad Ascii85 jest to, że zakodowane dane mogą zawierać znaki ucieczki, takie jak ukośnik odwrotny i cytat, które mają specjalne znaczenie w wielu językach programowania i niektórych protokołach tekstowych. Inne kodowania base-85, takie jak Z85 i RFC 1924, są zaprojektowane tak, aby były bezpieczne w kodzie źródłowym.

Historia

wersja btoa

Oryginalny program btoa zawsze kodował pełne grupy (dopełniając źródło w razie potrzeby), z linią prefiksu "xbtoa Begin" i linią sufiksu "xbtoa End", po której następuje oryginalna długość pliku (w systemie dziesiętnym i szesnastkowym ) i trzy 32 -bitowe sumy kontrolne . Dekoder musi użyć długości pliku, aby zobaczyć, jaka część grupy została dopełniona. Początkowa propozycja kodowania btoa wykorzystywała alfabet kodowania rozpoczynający się od znaku spacji ASCII do „t” włącznie, ale został on zastąpiony alfabetem kodowania „!” do "u", aby uniknąć "problemów z niektórymi programami pocztowymi (usuwając końcowe spacje)". Ten program wprowadził również specjalną zkrótką formę " " dla grupy całkowicie zerowej. Wersja 4.2 dodała ywyjątek " " dla grupy wszystkich znaków spacji ASCII (0x20202020).

Wersja ZMODEM

"Kodowanie ZMODEM Pack-7" koduje grupy 4 oktetów w grupy 5 drukowalnych znaków ASCII w podobny lub prawdopodobnie taki sam sposób, jak robi to Ascii85. Kiedy programy ZMODEM wysyłają wstępnie skompresowane 8-bitowe pliki danych przez 7-bitowe kanały danych , używa "kodowania ZMODEM Pack-7".

Wersja Adobe

Firma Adobe przyjęła podstawowe kodowanie btoa, ale z niewielkimi zmianami, i nadała mu nazwę Ascii85. Używane znaki to znaki ASCII od 33 ( !) do 117 ( u) włącznie (do reprezentowania cyfr o podstawie 85 od 0 do 84), wraz z literą z(jako przypadek specjalny do reprezentowania 32-bitowej wartości 0) i spacją jest ignorowane. Firma Adobe używa ogranicznika „ ~>” do oznaczenia końca ciągu zakodowanego w Ascii85 i reprezentuje długość przez obcięcie ostatniej grupy: Jeśli ostatni blok bajtów źródłowych zawiera mniej niż 4 bajty, blok jest uzupełniany maksymalnie o 3 bajty null przed kodowanie. Po zakodowaniu tyle bajtów, ile zostało dodanych, ile dopełnienie jest usuwane z końca danych wyjściowych.

Odwrotność jest stosowana podczas dekodowania: ostatni blok jest dopełniany do 5 bajtów znakiem Ascii85 ui tyle bajtów, ile zostało dodanych, jest pomijanych na końcu danych wyjściowych (patrz przykład).

UWAGA: Dopełnienie nie jest dowolne. Konwersja z binarnego na base 64 tylko przegrupowuje bity i nie zmienia ich ani ich kolejności (wyższy bit w systemie binarnym nie wpływa na niskie bity w reprezentacji base64). Podczas konwersji liczby binarnej na base85 (85 nie jest potęgą dwójki) wysokie bity wpływają na cyfry base85 niższego rzędu i odwrotnie. Dopełnienie binarnego low (bitami zerowymi) podczas kodowania i dopełnienie wartości base85 high (z us) w dekodowaniu zapewnia zachowanie bitów o wysokim porządku (wypełnienie zerami w binarnym daje wystarczająco dużo miejsca, aby mały dodatek został uwięziony i tam nie jest „przenoszenie” do wysokich bitów).

W blokach zakodowanych w Ascii85 białe znaki i znaki końca linii mogą być obecne w dowolnym miejscu, w tym w środku 5-znakowego bloku, ale muszą być po cichu ignorowane.

Specyfikacja Adobe nie obsługuje ywyjątku.

Przykład dla Ascii85

Cytat z Lewiatana Thomasa Hobbesa :

Człowieka wyróżnia nie tylko rozum, ale także ta szczególna pasja od innych zwierząt, która jest żądzą umysłu, która przez wytrwałe zachwyty w nieustannym i niestrudzonym wytwarzaniu wiedzy przewyższa krótkotrwałą gwałtowność jakiejkolwiek cielesnej przyjemności .

Jeśli jest to początkowo zakodowane przy użyciu US-ASCII, można je ponownie zakodować w Ascii85 w następujący sposób:

<~9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKF<GL>Cj@.4Gp$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~>
Treść tekstu m a n ... s ty r mi
ASCII 77 97 110 32 ... 115 117 114 101
Wzór bitowy 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 ... 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1
32-bitowa wartość 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
Baza 85 (+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

Ponieważ ostatnia 4-krotka jest niekompletna, należy ją uzupełnić trzema bajtami zerowymi:

Treść tekstu . \0 \0 \0
ASCII 46 0 0 0
Wzór bitowy 0 0 1 0 1 1 1 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
32-bitowa wartość 771 751 936 = 14×85 4 + 66×85 3 + 56×85 2 + 74×85 + 46
Baza 85 (+33) 14 (47) 66 (99) 56 (89) 74 (107) 46 (79)
ASCII / C Tak k O

Ponieważ trzeba było dodać trzy bajty dopełnienia, trzy końcowe znaki 'YkO' są pomijane w danych wyjściowych.

Dekodowanie odbywa się odwrotnie, z tą różnicą, że ostatnia piątka jest uzupełniona znakami 'u':

ASCII / C ty ty ty
Baza 85 (+33) 14 (47) 66 (99) 84 (117) 84 (117) 84 (117)
32-bitowa wartość 771 955 124 = 14×85 4 + 66×85 3 + 84×85 2 + 84×85 + 84
Wzór bitowy 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 0
ASCII 46 3 25 180
Treść tekstu . [ ETX ] [ EM ] ´ ( Rozszerzony ASCII )

Ponieważ dane wejściowe musiały być uzupełnione trzema bajtami „u”, ostatnie trzy bajty danych wyjściowych są ignorowane i otrzymujemy oryginalny okres.

Zdanie wejściowe nie zawiera 4 kolejnych bajtów zerowych, więc przykład nie pokazuje użycia skrótu „z”.

Zgodność

Kodowanie Ascii85 jest kompatybilne z 7-bitowym i 8-bitowym MIME , a jednocześnie ma mniejsze obciążenie niż Base64 .

Jednym z potencjalnych problemów ze zgodnością Ascii85 jest to, że „pojedyncze” i „podwójne” cudzysłowy, nawiasy <kątowe> i ampersandy (&) nie mogą być używane bez ucieczki w językach znaczników, takich jak XML lub SGML.

Wersja RFC 1924

Opublikowany 1 kwietnia 1996 roku informacyjny RFC  1924 : „A Compact Representation of IPv6 Addresses” autorstwa Roberta Elza sugeruje kodowanie Base-85 adresów IPv6 . Różni się to od schematu użytego powyżej tym, że proponuje inny zestaw 85 znaków ASCII i proponuje wykonanie wszystkich działań arytmetycznych na 128-bitowej liczbie, konwertując ją na pojedynczą 20-cyfrową liczbę o podstawie 85 (wewnętrzne białe znaki nie są dozwolone) , zamiast dzielić go na cztery 32-bitowe grupy.

Proponowany zestaw znaków to kolejno 09, AZ, az, a następnie 23 znaki !#$%&()*+-;<=>?@^_`{|}~. Najwyższa możliwa reprezentacja jest adres, 2 128 -1 x 85 = 74 19  + 53 x 85 18  + 5 x 85 17  + ... byłyby kodowane za =r54lj&NUUO~Hi%c2ym0.

Ten zestaw znaków wyklucza znaki "',./:[\] , dzięki czemu nadaje się do użycia w ciągach JSON (gdzie "i \wymagałby ucieczki). Jednak w przypadku protokołów opartych na SGML , w szczególności XML , nadal mogą być wymagane znaki ucieczki (aby uwzględnić <, >i &).

Zobacz też

Bibliografia

Zewnętrzne linki