Кодировщик и декодер Ascii85

Преобразуйте текст, шестнадцатеричные байты или файлы в Ascii85 — вариант Base85, используемый в PostScript и PDF, — и обратно. Добавьте ограничители Adobe или разбейте длинный результат на строки.

Работает полностью в браузере. Данные никуда не загружаются.

Как пользоваться

  1. Выберите «Кодировать», чтобы превратить текст или байты в Ascii85, или «Декодировать», чтобы получить данные из Ascii85.
  2. Включите «Ограничители <~ ~>», если результат будет вставлен в PostScript или должен совпадать с выводом Python a85encode с параметром adobe=True.
  3. При необходимости настройте «Перенос строк», чтобы длинный результат разбивался на строки.
  4. Введите или вставьте данные либо откройте файл, затем скопируйте или скачайте результат. При декодировании ограничители, пробелы и переводы строк игнорируются.

Что такое Ascii85?

Ascii85 читает входные данные по 4 байта, рассматривает каждую группу как 32-битное число и записывает её пятью цифрами в системе счисления с основанием 85. Цифрами служат 85 последовательных символов ASCII от ! (код 33) до u (код 117): каждый символ — это просто значение цифры плюс 33. Результат на 25% больше исходных данных, тогда как у Base64 — на 33%.

Впервые этот формат использовала утилита Unix btoa. Adobe приняла его в качестве кодировки ASCII base-85 в PostScript Level 2 и PDF, где он позволяет передавать двоичные данные, например изображения и шрифты, внутри обычного текстового файла. В Python он доступен как base64.a85encode(), а в Go — как пакет encoding/ascii85.

Сокращение z и ограничители Adobe

Группа из четырёх нулевых байтов обычно записывалась бы пятью восклицательными знаками. Вместо этого Ascii85 записывает её одним символом z, благодаря чему последовательности пустых данных остаются короткими. Сокращение применяется только к полным группам. Если длина входных данных не кратна 4, последняя группа из n байтов превращается в n + 1 символов и никогда не сокращается.

В PostScript строка Ascii85 обозначается символами <~ в начале и ~> в конце. В потоке PDF с фильтром ASCII85Decode используется только закрывающий ~> — как маркер конца данных. Декодер на этой странице удаляет любой из ограничителей, если он есть, и игнорирует пробельные символы, поэтому данные потока из файла PDF или PostScript можно вставлять напрямую.

Ascii85 в коде

# Python 3.4+
import base64
base64.a85encode(b'hello')                      # b'BOu!rDZ'
base64.a85encode(b'hello', adobe=True)          # b'<~BOu!rDZ~>'
base64.a85decode(b'<~BOu!rDZ~>', adobe=True)    # b'hello'

// Go
import "encoding/ascii85"
dst := make([]byte, ascii85.MaxEncodedLen(len(src)))
n := ascii85.Encode(dst, src)

Спецификация

АлфавитASCII от 33 (!) до 117 (u), а также z
Размер результата5 символов на каждые 4 байта (125%)
ДополнениеНет, необязательные ограничители <~ ~>
СтандартAdobe PostScript и PDF
Учёт регистраДа

Примеры

Исходные данные (UTF-8)Результат
Hello, World!87cURD_*#4DfTZ)+T
Base64.is6=FqH2Dd%#Er
你好jLq5JV7c

Часто задаваемые вопросы

Чем Ascii85 отличается от Base85?
Оба кодируют 4 байта в 5 символов, но с разными алфавитами. Ascii85 использует диапазон от ! до u и сокращение z. Страница Base85 использует алфавит RFC 1924 из Git и Python b85encode, а Z85 — это вариант ZeroMQ.
Почему в моём результате есть буква z?
Каждый символ z обозначает четыре нулевых байта в полной группе. Декодеры автоматически разворачивают его обратно, поэтому данные не меняются.
Нужны ли ограничители Adobe?

Только если их ожидает программа, которая будет читать данные, например интерпретатор PostScript или Python a85decode с параметром adobe=True. Многие инструменты принимают Ascii85 и без них. При декодировании на этой странице ограничители необязательны.

Можно ли декодировать поток ASCII85 из PDF?

Да. Вставьте данные потока и выберите формат вывода Hex или скачайте результат. Если в списке фильтров потока после ASCII85Decode указан FlateDecode, декодированные байты всё ещё сжаты zlib, и их нужно обработать вторым шагом.

Почему возникает ошибка о недопустимом символе?
Ascii85 допускает только символы от ! до u, а также z между группами. Сокращение y для четырёх пробелов, которое используют некоторые версии btoa и Python с параметром foldspaces=True, не входит в формат Adobe и отклоняется.