Как пользоваться
- Выберите «Кодировать», чтобы превратить текст или байты в Ascii85, или «Декодировать», чтобы получить данные из Ascii85.
- Включите «Ограничители <~ ~>», если результат будет вставлен в PostScript или должен совпадать с выводом Python a85encode с параметром adobe=True.
- При необходимости настройте «Перенос строк», чтобы длинный результат разбивался на строки.
- Введите или вставьте данные либо откройте файл, затем скопируйте или скачайте результат. При декодировании ограничители, пробелы и переводы строк игнорируются.
Что такое 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.is | 6=FqH2Dd%#Er |
你好 | jLq5JV7c |
Часто задаваемые вопросы
Чем Ascii85 отличается от Base85?
Почему в моём результате есть буква z?
z обозначает четыре нулевых байта в полной группе. Декодеры автоматически разворачивают его обратно, поэтому данные не меняются.Нужны ли ограничители Adobe?
Только если их ожидает программа, которая будет читать данные, например интерпретатор PostScript или Python a85decode с параметром adobe=True. Многие инструменты принимают Ascii85 и без них. При декодировании на этой странице ограничители необязательны.
Можно ли декодировать поток ASCII85 из PDF?
Да. Вставьте данные потока и выберите формат вывода Hex или скачайте результат. Если в списке фильтров потока после ASCII85Decode указан FlateDecode, декодированные байты всё ещё сжаты zlib, и их нужно обработать вторым шагом.
Почему возникает ошибка о недопустимом символе?
! до u, а также z между группами. Сокращение y для четырёх пробелов, которое используют некоторые версии btoa и Python с параметром foldspaces=True, не входит в формат Adobe и отклоняется.