Ascii85
Ascii85, також відома як Base85 — форма кодування двійкових даних, розроблена для утиліти btoa. Використовуючи 5 ASCII літер для представлення 4 байтів двійкових даних (що робить розмір закодованих даних на чверть більшим за оригінал, в разі використання 8-бітних ASCII символів), тому це кодування краще за uuencode і Base64, які для представлення 3х байтів використовують 4 символи (розмір збільшується на третину за тих же умов).
Нині головним чином використовується у файлових форматах PostScript компанії Adobe та Portable Document Format.
Головна ідея
Головна потреба в текстовому кодуванні двійкових даних витікає з необхідності передавати двійкові дані існуючими протоколами, які розроблялися для передачі лише зрозумілого людині тексту. Такими протоколами безпечно надсилати лише 7-бітні дані (то того ж потрібно уникати використання керуючих кодів ASCII) та інколи потрібно додавати символу закінчення рядку для обмеження довжини рядків і не містити пробілів. Тобто, «безпечно» використовувати лише 94 друковані літери ASCII.
Версія Adobe
Приклад
Наприклад, історичне гасло Вікіпедії,
- 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.
Посилання
- btoa і atob Джерельні тексти початкової програми 1990
- PostScript Language Reference (Adobe) — див. ASCII85Encode Filter
- Кодування та декодувння різними мовами програмування: