Ascii85 (také známý jako "Base85") je forma kódování binárních dat s textem vyvinutá Paulem E. Rutterem pro knihovnu btoa. Vzhledem k tomu, že pro zakódování 4 bajtů dat je použito 5 znaků ASCII (při použití 8bitových znaků ASCII jsou zpracovávaná data o ¹⁄₄ větší než originál), je dosaženo vyšší efektivity než v případě uuencode nebo Base64 , ve kterém jsou každé 3 bajty zakódovány 4 znaky (zvýšení o ¹⁄₃ za stejných podmínek).
Používá se hlavně ve formátech PostScript a Portable Document Format od Adobe .
Hlavní potřeba kódování dat v textu vyplývá z potřeby přenášet binární data pomocí existujících protokolů určených výhradně pro přenos textu (například e-mail). U těchto protokolů lze zaručit pouze předávání 7bitových hodnot (a vyhnout se použití řídicích znaků ASCII) a mohou vyžadovat vložení znaku konce řádku , aby se omezila délka řádků a umožnilo se odsazení mezerami. Tím zůstane pouze 94 tisknutelných znaků, které lze použít.
4 bajty mohou obsahovat 232 = 4294967296 různých hodnot. 5 číslic v základu 85 dává 855 = 4437053125 odlišných hodnot, což stačí k jednoznačné reprezentaci 32bitových hodnot. Pět číslic v základu 84 může poskytnout pouze hodnoty 84 5 = 4 182 119 424. Proto je 85 minimální základ číselné soustavy, ve které mohou být 4 bajty kódovány pěti číslicemi, a proto byla zvolena.
Při kódování rozdělujeme datový tok do skupin po 4 bytech a každou z nich považujeme za 32bitové číslo, přičemž horní bajt je na začátku . Postupným dělením 85 dostaneme 5 číslic 85členné číselné soustavy. Dále je každá číslice zakódována tisknutelným znakem ASCII a výstupem do výstupního proudu se zachováním pořadí od nejvýznamnější číslice po nejméně významnou.
Kódování číslice se znaky ASCII se provádí zvýšením o 33, tedy znaky s kódy od 33 (" !") do 117 (" u").
Protože nulové hodnoty nejsou tak vzácné, z důvodu dodatečné komprese je provedena další výjimka - nula čtyři bajty jsou zakódovány jediným znakem " z" namísto " !!!!!".
Skupina znaků, která po dekódování poskytne hodnotu větší než 2 32 − 1 (zakódovaná jako " s8W-!"), má za následek chybu dekódování, stejně jako znak " z" ve skupině. Všechny mezery mezi znaky jsou ignorovány a lze je vkládat libovolně pro pohodlné formátování.
Jedinou nevýhodou Ascii85 je, že výsledný text bude obsahovat znaky (jako jsou lomítka a uvozovky), které mají v programovacích jazycích a textových protokolech zvláštní význam.
Původní program btoa vždy kódoval v celých skupinách (druhé byly doplněny nulami) a před výsledným textem byl předponován řetězcem „xbtoa Begin“ následovaným „xbtoa End“ následovaným velikostí zdrojového souboru (decimální a hexadecimální) a třemi 32 -bitové kontrolní součty. Dekodér použil původní informaci o délce ke zjištění, kolik výplňových nul bylo vloženo.
Tento program také podporoval speciální hodnotu " z" pro kódování nul (0x00000000) a také " y" pro skupinu čtyř mezer (0x20202020).
Adobe upravilo kódování btoa s některými změnami a pojmenovalo ho Ascii85. Konkrétně ~>byl přidán oddělovač " ", který označuje konec zakódovaného řetězce a určuje, kde se má dekódovaný řetězec odříznout, aby se získala správná délka. To se provádí následovně: pokud poslední blok obsahuje méně než 4 bajty, pak se před kódováním doplní o nula bajtů a po kódování se odstraní tolik extrémních znaků, kolik nul bylo přidáno z posledních pěti.
Během dekódování je poslední blok doplněn na délku 5 symbolem „ u“ (kód 84) a po dekódování je stejný počet bajtů smazán (viz příklad níže).
Poznámka: Znak výplně nebyl vybrán náhodně. V Base64 se při překódování bity jednoduše přeskupí, nemění se ani jejich pořadí, ani jejich hodnoty (vysoké bity zdrojové sekvence neovlivňují nízké bity výsledku). Při převodu na číselnou soustavu se základem 85 (85 není mocnina dvojky) mají hodnoty vysokých bitů původní sekvence vliv na nízké bity výsledku (podobně jako při zpětném převodu). Přidání minimální hodnoty (0) při kódování a maximální hodnoty (84) při dekódování zajišťuje zachování vysokých bitů.
V bloku textu Ascii85 lze mezery a zalomení řádků vložit kamkoli, včetně pěti písmen. Měli by být prostě ignorováni.
Specifikace od Adobe nezahrnuje příponu " " ypro čtyři mezery.
Například historický slogan Wikipedie ,
Člověk se odlišuje nejen svým rozumem, ale i touto jedinečnou vášní od jiných zvířat, což je chtíč mysli, která vytrvalostí rozkoše v neustálém a neúnavném generování znalostí přesahuje krátkou prudkost jakékoli tělesné rozkoše. .zakódování v Ascii85 vypadá takto:
<~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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
binární reprezentace | 0 | jeden | 0 | 0 | jeden | jeden | 0 | jeden | 0 | jeden | jeden | 0 | 0 | 0 | 0 | jeden | 0 | jeden | jeden | 0 | jeden | jeden | jeden | 0 | 0 | 0 | jeden | 0 | 0 | 0 | 0 | 0 | ... | 0 | jeden | jeden | jeden | 0 | 0 | jeden | jeden | 0 | jeden | jeden | jeden | 0 | jeden | 0 | jeden | 0 | jeden | jeden | jeden | 0 | 0 | jeden | 0 | 0 | jeden | jeden | 0 | 0 | jeden | 0 | jeden |
desítkové zastoupení | 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 zastoupení (+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 | Ó | ^ | ... | F | * | 2 | M | 7 |
Protože poslední čtyři nejsou kompletní, musíme je „dokončit“ nulami:
Text | . | \0 | \0 | \0 | ||||||||||||||||||||||||||||
ASCII | 46 | 0 | 0 | 0 | ||||||||||||||||||||||||||||
binární reprezentace | 0 | 0 | jeden | 0 | jeden | jeden | jeden | 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 |
desítkové zastoupení | 771 751 936 = 14x85 4 + 66x85 3 + 56x85 2 + 74x85 + 46 | |||||||||||||||||||||||||||||||
85 zastoupení (+33) | 14 (47) | 66 (99) | 56 (89) | 74 (107) | 46 (79) | |||||||||||||||||||||||||||
ASCII | / | C | Y | k | Ó |
Při kódování jsme přidali 3 bajty a z výsledku musíme odstranit poslední tři znaky 'YkO'.
Dekódování je absolutně symetrické, s výjimkou posledních pěti, které „dokončíme“ znaky „u“:
ASCII | / | C | u | u | u | |||||||||||||||||||||||||||
85 zastoupení (+33) | 14 (47) | 66 (99) | 84 (117) | 84 (117) | 84 (117) | |||||||||||||||||||||||||||
desítkové zastoupení | 771 955 124 = 14×85 4 + 66×85 3 + 84×85 2 + 84×85 + 84 | |||||||||||||||||||||||||||||||
binární reprezentace | 0 | 0 | jeden | 0 | jeden | jeden | jeden | 0 | 0 | 0 | 0 | 0 | 0 | 0 | jeden | jeden | 0 | 0 | 0 | jeden | jeden | 0 | 0 | jeden | jeden | 0 | jeden | jeden | 0 | jeden | 0 | 0 |
ASCII | 46 | 3 | 25 | 180 | ||||||||||||||||||||||||||||
Text | . | [ ETX ] | [EM] | není definováno v ASCII |
Protože jsme přidali 3 'u, musíme z výsledku odstranit poslední 3 bajty. V důsledku toho dostaneme zprávu o původní délce.
Původní příklad neměl kvartet null bajtů, takže jsme ve výsledku neviděli zkrácené „z“.
Kódování Ascii85 je kompatibilní se 7bitovým i 8bitovým MIME , ale přináší menší prostorovou režii než Base64 .
Jediným potenciálním problémem je, že Ascii85 může obsahovat znaky, které musí být uvozeny ve značkovacích jazycích, jako je XML nebo SGML , jako jsou jednoduché a dvojité uvozovky, lomené závorky, ampersand (" '"<>&").
Informační RFC 1924 , zveřejněné 1. dubna 1996 : „A Compact Representation of IPv6 Addresses“ navrhuje zakódovat adresy IPv6 jako čísla v základu 85 (základ-85, podobně jako základ-64). Tento návrh se liší od výše uvedených schémat tím, že za prvé používá sadu dalších 85 znaků ASCII a za druhé považuje celou skupinu 128 bitů za jediné číslo, které převádí na 20 konečných znaků, a nikoli na skupiny. 32 bitů. Také mezery nejsou povoleny.
Doporučená znaková sada ve vzestupném pořadí kódů: 0- 9, A- Z, a- za 23 dalších znaků !#$%&()*+-;<=>?@^_`{|}~. Největší hodnota, která se vejde do 128 bitů adresy IPv6, je 2 128 −1 = 74×85 19 + 53×85 18 + 5×85 17 + …, má tvar =r54lj&NUUO~Hi%c2ym0.
Znaková sada je vybrána tak, aby se předešlo použití nejproblematičtějších znaků ( "',./:[]\), které je třeba v některých protokolech, jako je JSON, uvozovat. Tato sada však stále obsahuje znaky, které je třeba uvádět v protokolech SGML, jako je XML.