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

Преобразуйте текст, шестнадцатеричные байты или файлы в Base85 и обратно. На этой странице используется набор символов RFC 1924 — вариант, который выдаёт Python b85encode и который применяется в бинарных патчах Git.

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

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

  1. Выберите «Кодировать», чтобы превратить текст или байты в Base85, или «Декодировать», чтобы получить данные из Base85.
  2. Введите или вставьте исходные данные либо откройте файл. Если вы работаете с необработанными байтами, переключите формат ввода на Hex.
  3. Результат обновляется по мере ввода. При декодировании выберите формат вывода «Текст» или Hex в зависимости от содержимого данных.
  4. Скопируйте результат или скачайте его в виде файла.

Что такое 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.isLSb`dHZ(42a{
你好<h`KfrM&

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

Base85 и Ascii85 — это одно и то же?
У них одинаковая арифметика, но разные символы, поэтому результаты отличаются. Кроме того, Ascii85 сокращает четыре нулевых байта до z и может заключаться в ограничители Adobe. Для данных PDF и PostScript используйте страницу Ascii85.
Был ли RFC 1924 настоящим стандартом?

Нет. Это информационный RFC, опубликованный в качестве первоапрельской шутки, и для адресов IPv6 он никогда не применялся. Его набор символов стал популярным позже благодаря Git и Python.

Насколько результат Base85 больше исходных данных?
Каждые 4 байта превращаются в 5 символов, поэтому результат в 1,25 раза больше исходных данных. У Base64 — примерно в 1,33 раза. basE91 ещё немного компактнее.
Можно ли использовать Base85 в JSON или XML?
В JSON — да: в алфавите нет двойной кавычки и обратной косой черты, поэтому ничего экранировать не нужно. В XML и HTML нужно экранировать символы <, > и &. Base85 небезопасен для URL.