Ascii85
Ascii85 , также называемый Base85 , представляет собой форму кодирования двоичного текста в текст, разработанную Полом Э. Раттером для утилиты btoa . Используя пять символов ASCII для представления четырех байтов двоичных данных (что делает закодированный размер На 1 ⁄ 4 больше исходного, предполагая восемь бит на символ ASCII), он более эффективен, чем uuencode или Base64 , которые используют четыре символа для представления трех байтов данных ( увеличение на 1 ⁄ 3 , если предположить, что на символ ASCII приходится восемь бит).
Его основные современные применения находятся в форматах файлов Adobe PostScript , и Portable Document Format , а также в кодировании исправлений для двоичных файлов используемых Git . [1]
Обзор
[ редактировать ]Основная потребность в кодировании двоичного текста в текст возникает из-за необходимости передавать произвольные двоичные данные по ранее существовавшим протоколам связи , которые были разработаны для передачи только текста , читаемого человеком, на английском языке . Эти протоколы связи могут быть только 7-битными (и при этом избегать определенных управляющих кодов ASCII), могут требовать разрывов строк через определенные максимальные интервалы и не могут поддерживать пробелы . Таким образом, только 94 печатных символа ASCII «безопасны» для передачи данных.
Восемьдесят пять — это минимальное целое значение n такое, что n 5 ≥ 256 4 ; поэтому любая последовательность из 4 байтов может быть закодирована как 5 символов, если доступно не менее 85 различных символов. (Пять цифр по системе счисления -85 могут представлять целые числа от 0 до 4 437 053 124 включительно, чего достаточно для представления всех 4 294 967 296 возможных 4-байтовых последовательностей.)
Кодирование
[ редактировать ]При кодировании каждая группа из 4 байтов воспринимается как 32-битное двоичное число, начиная со старшего байта (в Ascii85 используется соглашение с обратным порядком байтов ). Это преобразуется путем многократного деления на 85 и получения остатка в 5 цифр по системе счисления 85. Затем каждая цифра (опять же, самая значимая первая) кодируется как печатный символ ASCII путем добавления к ней 33, что дает символам ASCII 33 ( !
) через 117 ( u
).
Поскольку данные, состоящие из всех нулей, встречаются довольно часто, для сжатия данных делается исключение , и группа, состоящая из всех нулей, кодируется как один символ. z
вместо !!!!!
.
Группы символов, которые декодируются до значения больше 2. 32 − 1 (закодировано как s8W-!
) вызовет ошибку декодирования, как и z
персонажи в середине группы. Пробелы между символами игнорируются и могут встречаться где угодно, чтобы учесть ограничения на длину строки.
Ограничения
[ редактировать ]Исходная спецификация позволяет кодировать только поток, размер которого кратен 4 байтам.
Закодированные данные могут содержать символы , имеющие особое значение во многих языках программирования и в некоторых текстовых протоколах, например левая угловая скобка. <
, обратная косая черта \
, а также одинарные и двойные кавычки '
& "
. Другие кодировки Base-85, такие как Z85 и RFC 1924 спроектирован так, чтобы обеспечить безопасность исходного кода. [2]
История
[ редактировать ]версия btoa
[ редактировать ]Исходная программа btoa всегда кодировала полные группы (при необходимости дополняя исходный код) со строкой префикса «xbtoa Begin» и суффиксной строкой «xbtoa End», за которой следовала исходная длина файла (в десятичном и шестнадцатеричном формате ) и три 32 -битные контрольные суммы . Декодеру необходимо использовать длину файла, чтобы увидеть, какая часть группы была заполнена. Первоначальное предложение по кодированию btoa использовало алфавит кодирования, начиная с символа пробела ASCII до «t» включительно, но он был заменен алфавитом кодирования «!» на «u», чтобы избежать «проблем с некоторыми почтовыми программами (удаление конечных пробелов)». [3] В этой программе также были представлены специальные " z
" краткая форма для нулевой группы. В версии 4.2 добавлен " y
"исключение для группы всех пробельных символов ASCII (0x20202020).
ZMODEM версия
[ редактировать ]«Кодировка ZMODEM Pack-7» кодирует группы по 4 октета в группы по 5 печатных символов ASCII аналогично или, возможно, таким же способом, как это делает Ascii85. Когда программа ZMODEM отправляет предварительно сжатые 8-битные файлы данных по 7-битным каналам данных , она использует «кодирование ZMODEM Pack-7». [4]
версия Adobe
[ редактировать ]Adobe приняла базовую кодировку btoa, но с небольшими изменениями, и дала ей имя Ascii85. Используются символы ASCII 33 ( !
) через 117 ( u
) включительно (для обозначения цифр по основанию 85 от 0 до 84) вместе с буквой z
(как особый случай для представления 32-битного значения 0), а пробелы игнорируются. Adobe использует разделитель " ~>
", чтобы отметить конец строки, закодированной Ascii85, и представляет длину путем усечения последней группы: если последний блок исходных байтов содержит менее 4 байтов, перед кодированием блок дополняется до 3 нулевых байтов. После кодирования столько байтов, сколько было добавлено в качестве заполнения, удаляется из конца вывода.
При декодировании применяется обратный процесс: последний блок дополняется до 5 байтов символом Ascii85. u
, и столько байтов, которые были добавлены в качестве заполнения, опускаются в конце вывода (см. пример).
Заполнение не является произвольным. Преобразование из двоичного формата в base64 только перегруппирует биты и не меняет их или их порядок (старший бит в двоичном формате не влияет на младшие биты в представлении base64). При преобразовании двоичного числа в base85 (85 не является степенью двойки) старшие биты влияют на младшие цифры base85 и наоборот. Заполнение младшего двоичного значения (нулевыми битами) при кодировании и заполнение верхнего значения base85 (с u
s) при декодировании гарантирует сохранение старших битов (заполнение нулями в двоичном формате дает достаточно места, чтобы небольшое сложение улавливалось и не было «переноса» в старшие биты).
В блоках с кодировкой Ascii85 символы пробелов и разрывов строк могут присутствовать где угодно, в том числе в середине 5-символьного блока, но их следует игнорировать.
Спецификация Adobe не поддерживает y
исключение.
Пример для Ascii85
[ редактировать ]Цитата из Томаса Гоббса «Левиафана» :
- Человек отличается от других животных не только своим разумом, но и этой особой страстью, которая представляет собой похоть ума, которая благодаря стойкости удовольствия от непрерывного и неутомимого познания превосходит кратковременную страсть любого плотского удовольствия. .
Если он изначально закодирован с использованием US-ASCII, его можно перекодировать в Ascii85 следующим образом:
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/AKYi( DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF<G:8+EV:.+Cf>-FD5W8ARlolDIal( DId<j@<?3r@:F%a+D58'ATD4$Bl@l3De:,-DJs`8ARoFb/0JMK@qB4^F!,R<AKZ&-DfTqBG%G>u D.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c
Текстовый контент | М | а | н | ... | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII-код | 77 | 97 | 110 | 32 | ... | ||||||||||||||||||||||||||||
Битовый шаблон | 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 | ... |
32-битное значение | 1,298,230,816 = 24×85 4 + 73×85 3 + 80×85 2 + 78×85 + 61 | ... | |||||||||||||||||||||||||||||||
База 85 (+33) | 24 (57) | 73 (106) | 80 (113) | 78 (111) | 61 (94) | ... | |||||||||||||||||||||||||||
ASCII-код | 9 | дж | д | тот | ^ | ... |
Текстовый контент | с | в | р | и | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII-код | 115 | 117 | 114 | 101 | ||||||||||||||||||||||||||||
Битовый шаблон | 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-битное значение | 1,937,076,837 = 37×85 4 + 9×85 3 + 17×85 2 + 44×85 + 22 | |||||||||||||||||||||||||||||||
База 85 (+33) | 37 (70) | 9 (42) | 17 (50) | 44 (77) | 22 (55) | |||||||||||||||||||||||||||
ASCII-код | Ф | * | 2 | М | 7 |
Поскольку последний четырехкортеж неполный, его необходимо дополнить тремя нулевыми байтами:
Текстовый контент | . | \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×85 4 + 66×85 3 + 56×85 2 + 74×85 + 46 | |||||||||||||||||||||||||||||||
База 85 (+33) | 14 (47) | 66 (99) | 56 (89) | 74 (107) | 46 (79) | |||||||||||||||||||||||||||
ASCII-код | / | с |
Поскольку необходимо было добавить три байта заполнения, три последних символа «YkO» в выводе опускаются.
Декодирование выполняется в обратном порядке, за исключением того, что последний кортеж из пяти элементов дополняется символами «u»:
ASCII-код | / | с | в | в | в | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
База 85 (+33) | 14 (47) | 66 (99) | 84 (117) | 84 (117) | 84 (117) | |||||||||||||||||||||||||||
32-битное значение | 771,955,124 = 14×85 4 + 66×85 3 + 84×85 2 + 84×85 + 84 | |||||||||||||||||||||||||||||||
Битовый шаблон | 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 | ||||||||||||||||||||||||||||
Текстовый контент | . | [ ЭТХ ] | [ В ] | ´ ( Расширенный ASCII ) |
Поскольку входные данные должны были быть дополнены тремя байтами «u», последние три байта выходных данных игнорируются, и в итоге мы получаем исходную точку.
Входное предложение не содержит 4 последовательных нулевых байта, поэтому в примере не показано использование сокращения «z».
Совместимость
[ редактировать ]Кодировка Ascii85 совместима с 7-битным и 8-битным MIME , но имеет меньшие накладные расходы, чем Base64 .
Одна из потенциальных проблем совместимости Ascii85 заключается в том, что некоторые из используемых им символов важны в таких языках разметки, как XML или SGML . Чтобы включить данные ascii85 в эти документы, может потребоваться экранирование кавычек , угловых скобок и амперсандов .
Версия RFC 1924 г.
[ редактировать ]Опубликовано 1 апреля 1996 года , информационное. RFC 1924 : «Компактное представление адресов IPv6» Роберта Эльца предлагает кодировку IPv6- адресов по основанию 85 в качестве первоапрельской шутки. Это отличается от схемы, использованной выше, тем, что он предлагает другой набор из 85 символов ASCII и предлагает выполнять всю арифметику над 128-битным числом, преобразуя его в одно 20-значное число по основанию 85 (внутренние пробелы не допускаются). , а не разбивать его на четыре 32-битные группы.
Предлагаемый набор символов по порядку: 0
– 9
, A
– Z
, a
– z
, а затем 23 символа !#$%&()*+-;<=>?@^_`{|}~
. Максимально возможный представимый адрес, 2 128 −1 = 74×85 19 + 53×85 18 + 5×85 17 + ..., будет закодировано как =r54lj&NUUO~Hi%c2ym0
.
Этот набор символов исключает символы "',./:[\]
, что делает его пригодным для использования в JSON (где строках "
и \
потребуется побег). Однако для протоколов на основе SGML, в частности, включая XML, по-прежнему может потребоваться экранирование строк (чтобы приспособить <
, >
и &
).
См. также
[ редактировать ]- База32
- База36
- База64
- Кодирование двоичного текста в текст для сравнения различных алгоритмов кодирования.
- Стандартная кодировка PostScript
Ссылки
[ редактировать ]- ^ Хамано, Джунио С (5 мая 2006 г.). «[PATCH] бинарный патч» . мерзавец . Архивировано из оригинала 26 июля 2020 г.
- ^ "32/Z85" в ZeroMQ RFC
- ^ Орост, Джо (26 марта 1991 г.). «Re: СЖАТИЕ двоичных данных в ASCII для отправки по почте. Re: Кодирование двоичных данных в ASCII для отправки по почте» . Группы Google . Проверено 11 апреля 2015 г.
- ^ Чак Форсберг. «Последние разработки в ZMODEM» . omen.com . Архивировано из оригинала 24 сентября 2015 г. Проверено 14 мая 2013 г. . «ZMODEM Pack-7 упаковывает 4 байта в 5 печатных символов».
Внешние ссылки
[ редактировать ]- базаE91
- Справочник по языку PostScript (Adobe) — см. фильтр ASCII85Encode.