Codificador e decodificador Z85

Converta texto, bytes em hex ou arquivos em Z85 e vice-versa. O Z85 é a variante do Base85 definida pelo ZeroMQ, com um alfabeto que cabe em literais de string no código-fonte sem escape.

Funciona inteiramente no seu navegador. Nada é enviado.

Como usar

  1. Escolha Codificar para transformar texto ou bytes em Z85, ou Decodificar para transformar Z85 de volta em dados.
  2. Para chaves e outros valores binários, defina a entrada como Hex ao codificar, ou a saída como Hex ao decodificar.
  3. Digite, cole ou abra um arquivo. O resultado é atualizado enquanto você digita.
  4. Copie o resultado ou baixe-o como arquivo.

O que é Z85?

O Z85 é especificado na RFC 32 do ZeroMQ (uma especificação da comunidade ZeroMQ, não uma RFC da IETF). Como outras codificações Base85, ele transforma cada grupo de 4 bytes em 5 caracteres: lê cada grupo como um número de 32 bits big-endian e o escreve como 5 dígitos na base 85, começando pelo mais significativo. A saída é 25% maior que a entrada.

O que diferencia o Z85 é o alfabeto: 0-9, a-z, A-Z e os 23 símbolos .-:+=^!/*?&<>()[]{}@%$#. Ele deixa de fora os dois tipos de aspas, a barra invertida, o acento grave, a vírgula, o ponto e vírgula, a barra vertical, o til e o sublinhado. O alfabeto foi pensado para ser seguro em strings no código-fonte, então um valor Z85 pode ser colado entre aspas em C, Python ou JSON sem nenhum escape.

Onde o Z85 é usado

O ZeroMQ usa o Z85 para exibir chaves CurveZMQ. Uma chave pública ou secreta de 32 bytes vira uma string Z85 de 40 caracteres, que é a forma retornada por zmq_curve_keypair() e aceita pelas opções de socket da segurança CURVE. A biblioteca também expõe zmq_z85_encode() e zmq_z85_decode(), e bindings como o pyzmq oferecem as mesmas funções.

// C (libzmq)
char text[41];                       // 32 bytes -> 40 caracteres + NUL
zmq_z85_encode(text, key, 32);

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

A última linha é o vetor de teste da especificação.

Comprimento da entrada: uma observação sobre esta ferramenta

A RFC 32 exige que a entrada binária tenha um múltiplo de 4 bytes e que a string codificada tenha um múltiplo de 5 caracteres. Ela não define preenchimento, e implementações estritas como zmq_z85_encode() recusam outros comprimentos.

Esta ferramenta também aceita outros comprimentos, usando a mesma regra do Ascii85 e do Base85: um grupo final de n bytes vira n + 1 caracteres. Trata-se de uma extensão fora do padrão. A saída gerada assim pode ser rejeitada por outros decodificadores Z85, então complete seus dados até um múltiplo de 4 bytes quando precisar de compatibilidade. As chaves CurveZMQ têm 32 bytes e sempre se encaixam nessa regra.

Especificação

Alfabeto0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$#
Tamanho da saída5 caracteres a cada 4 bytes (125%)
PreenchimentoNenhum
PadrãoZeroMQ RFC 32
Diferencia maiúsculas e minúsculasSim

Exemplos

Entrada (UTF-8)Saída
Hello, World!nm=QNz.92jz/PV8aP
Base64.islsB}Dhz^42A@
你好<H}kFRm=

Perguntas frequentes

Qual é a diferença entre Z85 e Ascii85?
A aritmética é a mesma, os alfabetos não. O Ascii85 usa o intervalo ASCII de ! a u, que inclui aspas e a barra invertida, e tem o atalho z para bytes zero. O Z85 evita caracteres que precisam de escape em strings e não tem atalho.
O Z85 usa preenchimento?

Não. A especificação só permite entradas com comprimento múltiplo de 4 bytes. Esta ferramenta codifica outros comprimentos com um grupo final mais curto, o que não faz parte do padrão.

Posso usar Z85 em JSON, XML ou URLs?
Em strings JSON, sim, sem nenhum escape. Em XML e HTML, <, > e & precisam de escape. Para URLs, o Z85 não é uma boa escolha, porque ?, &, / e # têm significado especial; use Base64URL ou Base58.
Qual é o comprimento de uma chave CurveZMQ codificada em Z85?

Uma chave CurveZMQ tem 32 bytes, então vira exatamente 40 caracteres. Para ver a chave bruta, decodifique-a aqui com a saída Hex.