Ascii85
Ascii85, також відома як Base85 — форма кодування двійкових даних, розроблена для утиліти btoa. Використовуючи 5 ASCII літер для представлення 4 байтів двійкових даних (що робить розмір закодованих даних на чверть більшим за оригінал, в разі використання 8-бітних ASCII символів), тому це кодування краще за uuencode і Base64, які для представлення 3х байтів використовують 4 символи (розмір збільшується на третину за тих же умов).
Нині головним чином використовується у файлових форматах PostScript компанії Adobe та Portable Document Format.
Головна потреба в текстовому кодуванні двійкових даних витікає з необхідності передавати двійкові дані існуючими протоколами, які розроблялися для передачі лише зрозумілого людині тексту. Такими протоколами безпечно надсилати лише 7-бітні дані (то того ж потрібно уникати використання керуючих кодів ASCII) та інколи потрібно додавати символу закінчення рядку для обмеження довжини рядків і не містити пробілів. Тобто, «безпечно» використовувати лише 94 друковані літери ASCII.
Наприклад, історичне гасло Вікіпедії,
- Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
виглядає у Ascii85 кодуванні наступним чином:
<~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~>
Текстовий вміст | M | a | n | ... | s | u | r | e | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ASCII | 77 | 97 | 110 | 32 | ... | 115 | 117 | 114 | 101 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Двійковий вигляд | 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-бітне значення | 1298230816 = 24×854 + 73×853 + 80×852 + 78×85 + 61 | ... | 1937076837 = 37×854 + 9×853 + 17×852 + 44×85 + 22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Base 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 |
Оскільки остання четвірка неповна, її треба доповнити трьома нульовими байтами:
Text content | . | \0 | \0 | \0 | ||||||||||||||||||||||||||||
ASCII | 46 | 0 | 0 | 0 | ||||||||||||||||||||||||||||
Двійковий вигляд | 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-бітне значення | 771,751,936 = 14×854 + 66×853 + 56×852 + 74×85 + 46 | |||||||||||||||||||||||||||||||
Base 85 (+33) | 14 (47) | 66 (99) | 56 (89) | 74 (107) | 46 (79) | |||||||||||||||||||||||||||
ASCII | / | c | Y | k | O |
--> Since three bytes of padding had to be added, the three final characters 'YkO' are omitted from the output.
Decoding is done inversely, except that the last 5-tuple is padded with 'u' characters:
ASCII | / | c | u | u | u | |||||||||||||||||||||||||||
Base 85 (+33) | 14 (47) | 66 (99) | 84 (117) | 84 (117) | 84 (117) | |||||||||||||||||||||||||||
32-bit Value | 771,955,124 = 14×854 + 66×853 + 84×852 + 84×85 + 84 | |||||||||||||||||||||||||||||||
Bit pattern | 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 | ||||||||||||||||||||||||||||
Text content | . | [ ETX ] | [ EM ] | undefined |
Since the input had to be padded with three 'u' bytes, the last three bytes of the output are ignored and we end up with the original period.
Note that the input sentence does not contain 4 consecutive zero bytes, so the example does not show the use of the 'z' abbreviation.
Ascii85 кодування сумісне з 7-бітним та 8-бітним MIME, маючи менший розмір ніж Base64.
Єдина проблема полягає в тому, що кодування Ascii85 містить символи (одинарні '
та подвійні "
лапки, прямі дужки та амперсанд &
), які мають бути екрановані в мовах розмітки на зразок XML або SGML.
- btoa [Архівовано 24 вересня 2015 у Wayback Machine.] і atob [Архівовано 24 вересня 2015 у Wayback Machine.] Джерельні тексти початкової програми 1990
- PostScript Language Reference [Архівовано 23 жовтня 2014 у Wayback Machine.] (Adobe) — див. ASCII85Encode Filter
- Кодування та декодувння різними мовами програмування:
- awk [Архівовано 29 грудня 2014 у Wayback Machine.]
- C
- C# [Архівовано 26 січня 2010 у Wayback Machine.]
- F# [Архівовано 23 квітня 2011 у Wayback Machine.]
- Java (documentation)
- Perl [Архівовано 25 квітня 2012 у Wayback Machine.]
- Python [Архівовано 2 грудня 2014 у Wayback Machine.]
- Yet another RFC1924/ASCII85/IPv6 Base85 Python implementation (APLv2) [Архівовано 24 грудня 2014 у Wayback Machine.]