Codificatore e decodificatore Z85

Converti testo, byte esadecimali o file in Z85 e viceversa. Z85 è la variante di Base85 definita da ZeroMQ, con un alfabeto che si può inserire nei letterali stringa del codice sorgente senza escape.

Funziona interamente nel tuo browser. Non viene caricato nulla.

Come si usa

  1. Scegli Codifica per trasformare testo o byte in Z85, oppure Decodifica per riportare Z85 ai dati originali.
  2. Per chiavi e altri valori binari, imposta Formato input su Esadecimale in codifica, oppure Formato output su Esadecimale in decodifica.
  3. Digita, incolla o apri un file. Il risultato si aggiorna mentre scrivi.
  4. Copia il risultato o scaricalo come file.

Che cos’è Z85?

Z85 è definito nella RFC 32 di ZeroMQ (una specifica della comunità ZeroMQ, non una RFC dell’IETF). Come le altre codifiche Base85, trasforma ogni gruppo di 4 byte in 5 caratteri: legge ciascun gruppo come un numero a 32 bit big-endian e lo scrive come 5 cifre in base 85, partendo dalla più significativa. L’output è il 25% più grande dell’input.

Ciò che distingue Z85 è il suo alfabeto: 0-9, a-z, A-Z e i 23 simboli .-:+=^!/*?&<>()[]{}@%$#. Esclude entrambi i tipi di virgolette, la barra rovesciata, l’accento grave, la virgola, il punto e virgola, la barra verticale, la tilde e il trattino basso. L’alfabeto è stato progettato per essere sicuro nelle stringhe del codice sorgente, quindi un valore Z85 si può incollare tra virgolette in C, Python o JSON senza alcun escape.

Dove si usa Z85

ZeroMQ usa Z85 per rappresentare in forma testuale le chiavi CurveZMQ. Una chiave pubblica o segreta di 32 byte diventa una stringa Z85 di 40 caratteri, che è la forma restituita da zmq_curve_keypair() e accettata dalle opzioni dei socket per la sicurezza CURVE. La libreria espone anche zmq_z85_encode() e zmq_z85_decode(), e binding come pyzmq offrono le stesse funzioni.

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

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

L’ultima riga è il vettore di test della specifica.

Lunghezza dell’input: una nota su questo strumento

La RFC 32 richiede che l’input binario sia un multiplo di 4 byte e la stringa codificata un multiplo di 5 caratteri. Non definisce alcun padding, e le implementazioni rigorose come zmq_z85_encode() rifiutano le altre lunghezze.

Questo strumento accetta anche altre lunghezze, con la stessa regola di Ascii85 e Base85: un gruppo finale di n byte diventa n + 1 caratteri. Si tratta di un’estensione non standard. L’output prodotto in questo modo potrebbe essere rifiutato da altri decodificatori Z85, quindi, se ti serve la compatibilità, porta i dati a un multiplo di 4 byte. Le chiavi CurveZMQ sono di 32 byte e rientrano sempre nella regola.

Specifiche

Alfabeto0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$#
Dimensione dell’output5 caratteri ogni 4 byte (125%)
PaddingNessuno
StandardZeroMQ RFC 32
Distingue maiuscole/minuscoleSì

Esempi

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

Domande frequenti

Qual è la differenza tra Z85 e Ascii85?
L’aritmetica è la stessa, gli alfabeti no. Ascii85 usa l’intervallo ASCII da ! a u, che comprende le virgolette e la barra rovesciata, e ha la scorciatoia z per i byte zero. Z85 evita i caratteri che nelle stringhe richiedono escape e non ha scorciatoie.
Z85 usa il padding?

No. La specifica ammette solo input di lunghezza multipla di 4 byte. Questo strumento codifica le altre lunghezze con un gruppo finale più corto, che non fa parte dello standard.

Posso usare Z85 in JSON, XML o negli URL?
Nelle stringhe JSON sì, senza escape. In XML e HTML, <, > e & vanno sottoposti a escape. Per gli URL Z85 è poco adatto, perché ?, &, / e # hanno un significato speciale; usa invece Base64URL o Base58.
Quanto è lunga una chiave CurveZMQ codificata in Z85?

Una chiave CurveZMQ è di 32 byte, quindi viene codificata in esattamente 40 caratteri. Per vedere la chiave grezza, decodificala qui con l’output Esadecimale.