Ascii85

редактировать

Ascii85, также называемый Base85, является формой кодирования двоичного кода в текст, разработанного Полом Э. Раттером для утилиты btoa. Используя пять символов ASCII для представления четырех байтов двоичных данных (делая кодированный размер на ⁄ 4 больше исходного, предполагая восемь бит на символ ASCII), он более эффективен, чем uuencode или Base64, которые используют четыре символа для представления трех байтов данных (⁄ 3 увеличение, предполагая восемь битов на символ ASCII).

Его основное современное использование - в форматах файлов Adobe PostScript и Portable Document Format, а также в патче . кодировка для двоичных файлов, используемых Git.

Содержание
  • 1 Обзор
  • 2 История
    • 2.1 версия btoa
    • 2.2 Версия ZMODEM
    • 2.3 Adobe версия
    • 2.4 Пример для Ascii85
    • 2.5 Совместимость
  • 3 RFC 1924 версия
  • 4 См. также
  • 5 Ссылки
  • 6 Внешние ссылки
Обзор

Основная потребность для кодирования двоичного текста в текст происходит из-за необходимости передавать произвольные двоичные данные по ранее существовавшим протоколам связи, которые были разработаны для передачи только английского языка , удобочитаемого человеком текст. Эти протоколы связи могут быть только 7-битными (и в этом случае избегать определенных управляющих кодов ASCII) и могут требовать разрывов строк через определенные максимальные интервалы и могут не содержать пробелов. Таким образом, только 95 печатаемых символов ASCII являются «безопасными» для использования для передачи данных.

Четыре байта могут представлять 2 = 4 294 967 296 возможных значений. Пять оснований системы счисления -85 цифр обеспечивают 85 = 4 437 053 125 возможных значений, что достаточно для обеспечения уникального представления для каждого возможного 32-битного значения. Поскольку пять цифр с основанием системы счисления-84 обеспечивают только 84 = 4 182 119 424 представимых значения, 85 - это минимально возможное целое основание, которое будет представлять четыре байта в пяти символах, отсюда и его выбор.

При кодировании каждая группа из 4 байтов принимается как 32-битное двоичное число, начиная со старшего байта (Ascii85 использует соглашение big-endian ). Он преобразуется путем многократного деления на 85 и взятия остатка на 5 цифр с основанием системы счисления 85. Затем каждая цифра (опять же, наиболее значимая первая) кодируется как печатный символ ASCII путем добавления к ней 33, что дает символы ASCII с 33 («!») до 117 («u").

Поскольку данные, содержащие все нули, довольно распространены, делается исключение для сжатия данных, а группа полностью нулевых значений кодируется как один символ "z"вместо" !!!!!".

Группы символов, которые декодируются до значения больше 2-1 (закодированного как «s8W-!»), вызовут ошибку декодирования, как и «z"персонажи в центре группы. Пробелы между символами игнорируются и могут находиться где угодно, чтобы учесть ограничения на длину строки.

Одним из недостатков Ascii85 является то, что закодированные данные могут содержать управляющие символы, такие как обратная косая черта и кавычки, которые имеют особое значение во многих языках программирования и в некоторых текстовых протоколах. Другие кодировки base-85, такие как Z85 и RFC 1924, разработаны для обеспечения безопасности в исходном коде.

История

версия btoa

Исходная программа btoa всегда закодированные полные группы (при необходимости дополняя источник), с префиксом «xbtoa Begin» и суффиксной строкой «xbtoa End», за которым следует исходная длина файла (в десятичном и шестнадцатеричном ) и три 32-битные контрольные суммы. Декодер должен использовать длину файла, чтобы увидеть, какая часть группы была заполнена. Первоначальное предложение для кодирования btoa использовало алфавит кодирования, начинающийся с символа пробела ASCII до символа «t» включительно, но он был заменен алфавитом кодирования «!» на «u», чтобы избежать «проблем с некоторыми почтовыми программами (удаление конечных пробелов)». Эта программа также представила специальную сокращенную форму «z» для группы «все нули». Версия 4.2 добавила исключение «y» для группы всех символов ASCII пробела (0x20202020).

ZMODEM версии

«Кодирование ZMODEM Pack-7» кодирует группы из 4 октетов в группы из 5 печатаемых символов ASCII аналогично или, возможно, так же, как это делает Ascii85. Когда программы ZMODEM отправляют предварительно сжатые 8-битные файлы данных по 7-битным каналам данных, они используют «кодировку ZMODEM Pack-7».

версия Adobe

Adobe приняла базовую кодировку btoa, но с небольшими изменениями, и дала ей имя Ascii85. Используются символы ASCII с 33 (!) По 117 (u) включительно (для представления цифр от 0 до 84 по основанию 85) вместе с буквой z (в качестве особого случая для представления 32-битного значения 0), и пустое пространство игнорируется. Adobe использует разделитель «~>» для обозначения конца строки в кодировке Ascii85 и представляет длину путем усечения последней группы: если последний блок исходных байтов содержит менее 4 байтов, блок перед кодированием дополняется до трех нулевых байтов. После кодирования из конца вывода удаляется столько байтов, сколько было добавлено в качестве заполнения.

При декодировании применяется обратное: последний блок дополняется до 5 байтов с помощью символа Ascii85 «u», и столько байтов, сколько было добавлено в качестве заполнения, опускается с конца вывод (см. пример).

ПРИМЕЧАНИЕ. Заполнение не является произвольным. Преобразование из двоичного в базовый 64 только перегруппирует биты и не меняет их или их порядок (старший бит в двоичном формате не влияет на младшие биты в представлении base64). При преобразовании двоичного числа в base85 (85 не является степенью двойки) старшие биты влияют на младшие цифры base85 и наоборот. Заполнение двоичного низкого уровня (с нулевыми битами) при кодировании и заполнение высокого значения base85 (с помощью 'u) при декодировании гарантирует, что биты высокого порядка сохраняются (нулевое заполнение в двоичном формате дает достаточно места, чтобы небольшое добавление было захвачено и нет "переноса" в старшие биты).

. В блоках с кодировкой Ascii85 пробелы и символы разрыва строки могут присутствовать где угодно, в том числе в середине 5-символьного блока, но они должны игнорироваться.

Спецификация Adobe не поддерживает исключение «y».

Пример для Ascii85

Цитата из Томаса Гоббса Левиафан :

. Человека отличает не только его разум, но и эта особая страсть. животных, то есть вожделение ума, которое благодаря настойчивости восторга в непрерывном и неутомимом накоплении знаний превосходит кратковременную страсть любого плотского удовольствия.

Если это изначально закодировано с использованием US-ASCII, это может быть перекодировано в Ascii85 следующим образом:

<~9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKFCj @.4Gp $ d7F!, L7 @ <[email#160;protected] )/0JDEF@ 3BB / F * OCAfu2 / AKY i (DIb: @FD, *) + C] U = @ 3BN # EcYf8ATD3s @ q ? d $ AftVqCh [NqF -FD5W8ARlolDIa l (DId uD.RTpAKYo '+ CT / 5 + Cei # DII? (E, 9) oF * 2M7 / c ~>
Текстовое содержимоеMan...sure
ASCII779711032...115117114101
Битовая комбинация01001101011000010110111000100000...01110011011101010111001001100101
32-битное значение1,298,230,816 = 24 × 85 + 73 × 85 + 80 × 85 + 78 × 85 + 61...1 937 076 837 = 37 × 85 + 9 × 85 + 17 × 85 + 44 × 85 + 22
База 85 (+33)24 (57)73 (106)80 (113)78 (111)61 (94)...37 (70)9 (42)17 (50)44 (77)22 (55)
ASCII9jqo^...F*2M7

Поскольку последний кортеж из четырех элементов является неполным, он должен быть дополнен тремя нулевыми байтами:

Текстовое содержимое.\ 0\ 0\ 0
ASCII46000
Битовая комбинация00101110000000000000000000000000
32-битное значение771,751,936 = 14 × 85 + 66 × 85 + 56 × 85 + 74 × 85 + 46
База 85 (+ 33)14 (47)66 (99)56 (89)74 (107)46 ( 79)
ASCII/cYkO

Поскольку нужно было добавить три байта заполнения, три последних символа 'YkO' опускаются из вывода.

Декодирование выполняется в обратном порядке, за исключением того, что последние 5 кортежей дополняются символами «u»:

ASCII/cuuu
Base 85 (+33)14 (47)66 (99)84 (117)84 (117)84 (117)
32-битное значение771,955,124 = 14 × 85 + 66 × 85 + 84 × 85 + 84 × 85 + 84
Битовый шаблон00101110000000110001100110110100
ASCII46325180
Текстовое содержимое.[ ETX ][EM]´ (Extended ASCII )

Поскольку ввод должен был быть дополнен тремя байтами 'u', последние три байта вывода игнорируются, и мы получаем исходную точку.

Входное предложение не содержит 4 последовательных нулевых байта, поэтому в примере не показано использование аббревиатуры 'z'.

Совместимость

Кодировка Ascii85 совместима с 7-битным и 8-битным MIME, при этом имеет меньше накладных расходов, чем Base64.

. Одна из потенциальных проблем совместимости Ascii85 заключается в том, что «одиночный» и "двойные" кавычки, скобки и амперсанды () нельзя использовать без экранирования i n языков разметки, таких как XML или SGML.

RFC 1924 версия

Опубликовано 1 апреля 1996 г., информационное RFC 1924 : «Краткое представление IPv6 Адреса "от Роберт Элз предлагает кодировку base-85 для адресов IPv6. Это отличается от схемы, использованной выше, тем, что он предлагает другой набор из 85 символов ASCII и предлагает выполнять всю арифметику над 128-битным числом, преобразовывая его в одно 20-значное число с основанием 85 (внутренние пробелы не допускаются), а не разбивать его на четыре 32-битные группы.

Предлагаемый набор символов по порядку: 09, AZ, az, а затем 23 символа ! # $% () * + -; <=>? @ ^ _ `{|} ~. Максимально возможный представимый адрес, 2−1 = 74 × 85 + 53 × 85 + 5 × 85 +..., будет закодирован как = r54lj NUUO ~ Hi% c2ym0.

Этот набор символов исключает символы "',. /: [\], что делает его пригодным для использования в строках JSON (где "и \потребуют экранирования). Однако для протоколов на основе SGML, в частности, включая XML, по-прежнему могут потребоваться escape-символы (для соответствия <, >и ).

См. Также
Ссылки
  1. ^Хунио Хамано (5 мая 2006 г.). «двоичный патч».
  2. ^«Z85 - алгоритм кодирования ZeroMQ Base-85»
  3. ^Орост, Джо. "Re: СЖАТИЕ двоичных данных в почтовый ASCII Re: Кодирование двоичных данных в почтовый ASCII". Группы Google. Проверено 11 апреля 2015 г.
  4. ^Чак Форсберг. «Последние разработки в ZMODEM». Архивировано 24 сентября 2015 года из оригинала. Проверено 14 мая 2013 г.. «ZMODEM Pack-7 упаковывает 4 байта в 5 печатных символов».
Внешние ссылки
Последняя правка сделана 2021-06-11 23:00:57
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте