Как пользоваться
- Выберите «Кодировать», чтобы превратить текст или байты в Base85, или «Декодировать», чтобы получить данные из Base85.
- Введите или вставьте исходные данные либо откройте файл. Если вы работаете с необработанными байтами, переключите формат ввода на Hex.
- Результат обновляется по мере ввода. При декодировании выберите формат вывода «Текст» или Hex в зависимости от содержимого данных.
- Скопируйте результат или скачайте его в виде файла.
Что такое Base85?
Base85 — это семейство кодировок, которые превращают каждые 4 байта в 5 символов. Пять цифр в системе счисления с основанием 85 могут представить 85 × 85 × 85 × 85 × 85 = 4 437 053 125 значений — как раз достаточно для любого 32-битного числа, поэтому результат всего на 25% больше исходных данных, тогда как у Base64 — на 33%.
Существует несколько алфавитов Base85, и они не взаимозаменяемы: Ascii85 (Adobe, PDF), Z85 (ZeroMQ) и алфавит, используемый на этой странице. В нём есть 0-9, A-Z, a-z и 23 символа: !#$%&()*+-;<=>?@^_`{|}~. Кавычки, запятая, точка, косая черта, двоеточие, обратная косая черта и квадратные скобки в него не входят.
RFC 1924, Git и Python
Набор символов взят из RFC 1924 «A Compact Representation of IPv6 Addresses» («Компактное представление адресов IPv6»), опубликованного 1 апреля 1996 года в качестве первоапрельской шутки. В нём предлагалось записывать 128-битный адрес IPv6 одним числом с основанием 85 длиной ровно 20 символов. Никто так адреса IPv6 не записывает, но позже этот алфавит стали использовать для произвольных двоичных данных:
- Git хранит бинарные файлы в патчах (
git diff --binary,git format-patch) в виде сжатых zlib данных, закодированных этим алфавитом, с символом длины в начале каждой строки. - Python начиная с версии 3.4 предоставляет функции
base64.b85encode()иb85decode(), результат которых совпадает с результатом этого инструмента. - Mercurial использует ту же кодировку для бинарных файлов в диффах в стиле Git.
Учтите, что RFC 1924 преобразует весь 128-битный адрес сразу, а Git, Python и этот инструмент работают группами по 4 байта, поэтому для 16-байтового значения результат будет отличаться от метода из RFC.
Неполные последние группы
Если длина входных данных не кратна 4, последняя группа дополняется нулевыми байтами, кодируется, и сохраняются только первые n + 1 символов: 1 байт превращается в 2 символа, 2 байта — в 3, а 3 байта — в 4. Декодер выполняет обратное преобразование, поэтому символы дополнения не нужны. В отличие от z в Ascii85, в этом варианте нет сокращённой записи для нулевых байтов.
# Python 3.4+
import base64
base64.b85encode(b'hello') # b'Xk~0{Zv'
base64.b85decode(b'Xk~0{Zv') # b'hello'
Спецификация
| Алфавит | 0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~ |
|---|---|
| Размер результата | 5 символов на каждые 4 байта (125%) |
| Дополнение | Нет |
| Стандарт | Набор символов RFC 1924 (Git, Python b85) |
| Учёт регистра | Да |
Примеры
| Исходные данные (UTF-8) | Результат |
|---|---|
Hello, World! | NM&qnZ!92JZ*pv8Ap |
Base64.is | LSb`dHZ(42a{ |
你好 | <h`KfrM& |
Часто задаваемые вопросы
Base85 и Ascii85 — это одно и то же?
z и может заключаться в ограничители Adobe. Для данных PDF и PostScript используйте страницу Ascii85.Был ли RFC 1924 настоящим стандартом?
Нет. Это информационный RFC, опубликованный в качестве первоапрельской шутки, и для адресов IPv6 он никогда не применялся. Его набор символов стал популярным позже благодаря Git и Python.
Насколько результат Base85 больше исходных данных?
Можно ли использовать Base85 в JSON или XML?
<, > и &. Base85 небезопасен для URL.