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

Преобразуйте текст, шестнадцатеричные байты или файлы в Z85 и обратно. Z85 — это вариант Base85, определённый в ZeroMQ, алфавит которого можно использовать в строковых литералах исходного кода без экранирования.

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

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

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

Что такое Z85?

Z85 описан в ZeroMQ RFC 32 (это спецификация сообщества ZeroMQ, а не RFC IETF). Как и другие кодировки Base85, он превращает каждые 4 байта в 5 символов: каждая группа читается как 32-битное число в порядке big-endian и записывается пятью цифрами в системе счисления с основанием 85, начиная со старшей. Результат на 25% больше исходных данных.

Z85 выделяется своим алфавитом: 0-9, a-z, A-Z и 23 символа .-:+=^!/*?&<>()[]{}@%$#. В него не входят оба вида кавычек, обратная косая черта, обратный апостроф, запятая, точка с запятой, вертикальная черта, тильда и знак подчёркивания. Алфавит был задуман так, чтобы быть безопасным в строках исходного кода, поэтому значение Z85 можно вставить в кавычки в C, Python или JSON без какого-либо экранирования.

Где используется Z85

ZeroMQ использует Z85 для текстового представления ключей CurveZMQ. Открытый или секретный ключ длиной 32 байта превращается в строку Z85 из 40 символов — именно в таком виде его возвращает zmq_curve_keypair() и принимают параметры сокета для защиты CURVE. Библиотека также предоставляет функции zmq_z85_encode() и zmq_z85_decode(), а такие привязки, как pyzmq, предлагают те же функции.

// C (libzmq)
char text[41];                       // 32 байта -> 40 символов + NUL
zmq_z85_encode(text, key, 32);

# Python (pyzmq)
from zmq.utils import z85
z85.encode(bytes.fromhex('864fd26fb559f75b'))   # b'HelloWorld'

Последняя строка — это тестовый пример из спецификации.

Длина входных данных: особенность этого инструмента

RFC 32 требует, чтобы длина двоичных входных данных была кратна 4 байтам, а длина закодированной строки — 5 символам. Дополнение в нём не определено, и строгие реализации, например zmq_z85_encode(), отказываются обрабатывать данные другой длины.

Этот инструмент принимает и другие длины, применяя то же правило, что и Ascii85 и Base85: последняя группа из n байтов превращается в n + 1 символов. Это нестандартное расширение. Полученный таким образом результат могут отклонить другие декодеры Z85, поэтому, если важна совместимость, дополняйте данные до длины, кратной 4 байтам. Ключи CurveZMQ имеют длину 32 байта и всегда этому условию соответствуют.

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

Алфавит0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$#
Размер результата5 символов на каждые 4 байта (125%)
ДополнениеНет
СтандартZeroMQ RFC 32
Учёт регистраДа

Примеры

Исходные данные (UTF-8)Результат
Hello, World!nm=QNz.92jz/PV8aP
Base64.islsB}Dhz^42A@
你好<H}kFRm=

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

Чем Z85 отличается от Ascii85?
Арифметика одинаковая, а алфавиты разные. Ascii85 использует диапазон ASCII от ! до u, в который входят кавычки и обратная косая черта, и имеет сокращение z для нулевых байтов. Z85 избегает символов, требующих экранирования в строках, и сокращений не имеет.
Используется ли в Z85 дополнение?

Нет. Спецификация допускает только входные данные длиной, кратной 4 байтам. Этот инструмент кодирует данные другой длины с укороченной последней группой, что не входит в стандарт.

Можно ли использовать Z85 в JSON, XML или URL?
В строках JSON — да, без экранирования. В XML и HTML нужно экранировать <, > и &. Для URL Z85 подходит плохо, потому что ?, &, / и # имеют там особое значение; вместо него используйте Base64URL или Base58.
Какой длины ключ CurveZMQ в кодировке Z85?

Ключ CurveZMQ занимает 32 байта, поэтому кодируется ровно в 40 символов. Чтобы увидеть необработанный ключ, декодируйте его здесь с форматом вывода Hex.