Ascii85 (även känd som "Base85") är en form av kodning av binär data med text utvecklad av Paul E. Rutter för btoa-biblioteket. På grund av det faktum att 5 ASCII- tecken används för att koda 4 byte data (de bearbetade data är ¹⁄₄ större än originalet när man använder 8-bitars ASCII-tecken), uppnås mer effektivitet än i fallet med uuencode eller Base64 , där var tredje byte är kodad med 4 tecken (en ökning med ¹⁄₃ under samma förhållanden).
Det används huvudsakligen i formaten PostScript och Portable Document Format från Adobe .
Det huvudsakliga behovet av att koda data i text härrör från behovet av att överföra binära data med hjälp av befintliga protokoll som uteslutande är utformade för textöverföring (till exempel e-post). Sådana protokoll kan endast garanteras att de passerar 7-bitars värden (och undviker användningen av ASCII-kontrolltecken), och kan kräva infogning av ett radsluttecken för att begränsa längden på rader och tillåta blankstegsindragning. Detta lämnar endast 94 utskrivbara tecken som kan användas.
4 byte kan innehålla 232 = 4294967296 distinkta värden. 5 siffror i bas 85 ger 855 = 4437053125 distinkta värden, vilket är tillräckligt för att representera 32-bitars värden entydigt. Fem siffror i bas 84 kan bara ge 84 5 = 4 182 119 424 värden. Därför är 85 minimibasen i talsystemet där 4 byte kan kodas med fem siffror, vilket är anledningen till att det valdes.
Vid kodning delar vi in dataströmmen i grupper om 4 byte och betraktar var och en av dem som ett 32-bitars nummer, med den höga byten i början . Genom att dividera i följd med 85 får vi 5 siffror i det 85-åriga talsystemet. Vidare kodas varje siffra med ett utskrivbart ASCII-tecken och matas ut till utgångsströmmen med ordningen bevarad från den mest signifikanta siffran till den minst signifikanta.
Kodningen av en siffra med ASCII-tecken utförs genom att öka med 33, det vill säga tecken med koder från 33 (" !") till 117 (" u").
Eftersom nollvärden inte är så sällsynta, för ytterligare komprimering, görs ett ytterligare undantag - noll fyra byte kodas med ett enda tecken " z" istället för " !!!!!".
En grupp tecken som när de avkodas ger ett värde större än 2 32 − 1 (kodad som " s8W-!") resulterar i ett avkodningsfel, liksom tecknet " z" i gruppen. Alla blankstegsindrag mellan tecken ignoreras och kan infogas godtyckligt för bekväm formatering.
Den enda nackdelen med Ascii85 är att den resulterande texten kommer att innehålla tecken (som snedstreck och citattecken) som har speciella betydelser i programmeringsspråk och textprotokoll.
Det ursprungliga btoa-programmet kodades alltid i hela grupper (det senare utfyllt med nollor) och prefixet den resulterande texten med strängen "xbtoa Begin" följt av "xbtoa End" följt av storleken på källfilen (decimal och hexadecimal) och tre 32 -bitars kontrollsummor. Avkodaren använde den ursprungliga längdinformationen för att ta reda på hur många utfyllnadsnollor som satts in.
Detta program stödde också det speciella värdet " z" för att koda nollor (0x00000000), samt " y" för en grupp med fyra mellanslag (0x20202020).
Adobe anpassade btoa-kodningen med några ändringar och gav den namnet Ascii85. I synnerhet har avgränsaren " ~>" lagts till för att indikera slutet på den kodade strängen och bestämma var den avkodade strängen ska klippas för att få rätt längd. Detta görs på följande sätt: om det sista blocket innehåller mindre än 4 byte, så kompletteras det med noll byte före kodning, och efter kodning tas lika många extrema tecken som nollor som lagts till från de senaste fem bort.
Under avkodningen utfylls det sista blocket till en längd av 5 med symbolen " u" (kod 84), och efter avkodningen raderas samma antal byte (se exempel nedan).
Obs: Fyllningstecknet valdes inte slumpmässigt. I Base64, vid omkodning, omgrupperas bitarna helt enkelt, varken deras ordning eller värde ändras (de höga bitarna i källsekvensen påverkar inte de låga bitarna i resultatet). När den konverteras till ett talsystem med basen 85 (85 är inte en potens av två), påverkar värdena för de höga bitarna i den ursprungliga sekvensen de låga bitarna i resultatet (på samma sätt när man konverterar tillbaka). Tillägget av ett minimivärde (0) vid kodning och ett maximumvärde (84) vid avkodning säkerställer att de höga bitarna bevaras.
I ett block med Ascii85-text kan mellanslag och radbrytningar infogas var som helst, inklusive inuti femma bokstäver. De ska helt enkelt ignoreras.
Specifikationen från Adobe inkluderar inte tillägget " " yför fyra utrymmen.
Till exempel Wikipedias historiska slogan ,
Människan utmärker sig, inte bara genom sitt förnuft, utan genom denna enastående passion från andra djur, som är en lust i sinnet, som genom en uthållighet av glädje i den fortsatta och outtröttliga generationen av kunskap överstiger den korta häftigheten av varje köttsligt nöje. .att vara kodad i Ascii85 ser ut så här:
<~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~>Text | M | a | n | ... | s | u | r | e | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ASCII | 77 | 97 | 110 | 32 | ... | 115 | 117 | 114 | 101 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
binär representation | 0 | ett | 0 | 0 | ett | ett | 0 | ett | 0 | ett | ett | 0 | 0 | 0 | 0 | ett | 0 | ett | ett | 0 | ett | ett | ett | 0 | 0 | 0 | ett | 0 | 0 | 0 | 0 | 0 | ... | 0 | ett | ett | ett | 0 | 0 | ett | ett | 0 | ett | ett | ett | 0 | ett | 0 | ett | 0 | ett | ett | ett | 0 | 0 | ett | 0 | 0 | ett | ett | 0 | 0 | ett | 0 | ett |
decimal representation | 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 representation (+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 |
Eftersom de fyra sista inte är kompletta måste vi "avsluta" det med nollor:
Text | . | \0 | \0 | \0 | ||||||||||||||||||||||||||||
ASCII | 46 | 0 | 0 | 0 | ||||||||||||||||||||||||||||
binär representation | 0 | 0 | ett | 0 | ett | ett | ett | 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 |
decimal representation | 771 751 936 = 14x85 4 + 66x85 3 + 56x85 2 + 74x85 + 46 | |||||||||||||||||||||||||||||||
85 representation (+33) | 14 (47) | 66 (99) | 56 (89) | 74 (107) | 46 (79) | |||||||||||||||||||||||||||
ASCII | / | c | Y | k | O |
Vi har lagt till 3 byte vid kodning och måste ta bort de tre sista "YkO"-tecknen från resultatet.
Avkodningen är absolut symmetrisk, förutom de fem sista, som vi "avslutar" med "u"-tecken:
ASCII | / | c | u | u | u | |||||||||||||||||||||||||||
85 representation (+33) | 14 (47) | 66 (99) | 84 (117) | 84 (117) | 84 (117) | |||||||||||||||||||||||||||
decimal representation | 771 955 124 = 14×85 4 + 66×85 3 + 84×85 2 + 84×85 + 84 | |||||||||||||||||||||||||||||||
binär representation | 0 | 0 | ett | 0 | ett | ett | ett | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ett | ett | 0 | 0 | 0 | ett | ett | 0 | 0 | ett | ett | 0 | ett | ett | 0 | ett | 0 | 0 |
ASCII | 46 | 3 | 25 | 180 | ||||||||||||||||||||||||||||
Text | . | [ ETX ] | [EM] | inte definierat i ASCII |
Eftersom vi har lagt till 3 'u' måste vi ta bort de sista 3 byten från resultatet. Som ett resultat får vi ett meddelande av den ursprungliga längden.
Det ursprungliga exemplet hade inte en kvartett med nollbyte, så vi såg inte det förkortade 'z' i resultatet.
Ascii85-kodning är kompatibel med både 7-bitars och 8-bitars MIME , men kommer ändå med mindre utrymmeskostnader än Base64 .
Det enda potentiella problemet är att Ascii85 kan innehålla tecken som måste escapes i märkningsspråk som XML eller SGML , såsom enkla och dubbla citattecken, vinkelparenteser, et- tecken (" '"<>&").
Publicerad den 1 april 1996, informativ RFC 1924 : "A Compact Representation of IPv6 Addresses" föreslår att koda IPv6 -adresser som nummer i bas 85 (bas-85, liknande bas-64). Detta förslag skiljer sig från ovanstående scheman genom att det för det första använder en uppsättning andra 85 ASCII-tecken, och för det andra behandlar det hela gruppen på 128 bitar som ett enda nummer, omvandlar det till 20 sista tecken, och inte i grupper på 32 bitar. Dessutom är utrymmen inte tillåtna.
Föreslagen teckenuppsättning, i stigande kodordning: 0- 9, A- Z, a- zoch ytterligare 23 tecken !#$%&()*+-;<=>?@^_`{|}~. Det största värdet som passar in i 128 bitar av en IPv6-adress är 2 128 −1 = 74×85 19 + 53×85 18 + 5×85 17 + …, har formen =r54lj&NUUO~Hi%c2ym0.
Teckenuppsättningen är vald för att undvika att använda de mest problematiska tecknen ( "',./:[]\) som måste escapes i vissa protokoll, till exempel JSON. Men den här uppsättningen innehåller fortfarande tecken som måste escapes i SGML-protokoll, som XML.