Как пользоваться
- Выберите «Кодировать», чтобы превратить текст или байты в Z85, или «Декодировать», чтобы получить данные из Z85.
- Для ключей и других двоичных значений выберите формат ввода Hex при кодировании или формат вывода Hex при декодировании.
- Введите или вставьте данные либо откройте файл. Результат обновляется по мере ввода.
- Скопируйте результат или скачайте его в виде файла.
Что такое 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.is | lsB}Dhz^42A@ |
你好 | <H}kFRm= |
Часто задаваемые вопросы
Чем Z85 отличается от Ascii85?
! до u, в который входят кавычки и обратная косая черта, и имеет сокращение z для нулевых байтов. Z85 избегает символов, требующих экранирования в строках, и сокращений не имеет.Используется ли в Z85 дополнение?
Нет. Спецификация допускает только входные данные длиной, кратной 4 байтам. Этот инструмент кодирует данные другой длины с укороченной последней группой, что не входит в стандарт.
Можно ли использовать Z85 в JSON, XML или URL?
Какой длины ключ CurveZMQ в кодировке Z85?
Ключ CurveZMQ занимает 32 байта, поэтому кодируется ровно в 40 символов. Чтобы увидеть необработанный ключ, декодируйте его здесь с форматом вывода Hex.