Kodare och avkodare för Z85

Konvertera text, hexbyte eller filer till Z85 och tillbaka. Z85 är den Base85-variant som ZeroMQ har definierat, med ett alfabet som får plats i strängliteraler i källkod utan escape-tecken.

Körs helt i din webbläsare. Inget laddas upp.

Så använder du verktyget

  1. Välj Koda för att göra om text eller byte till Z85, eller Avkoda för att göra om Z85 till data igen.
  2. För nycklar och andra binära värden väljer du Hex under Indata som vid kodning, eller Hex under Utdata som vid avkodning.
  3. Skriv, klistra in eller öppna en fil. Resultatet uppdateras medan du skriver.
  4. Kopiera resultatet eller ladda ned det som en fil.

Vad är Z85?

Z85 specificeras i ZeroMQ RFC 32 (en specifikation från ZeroMQ-communityn, inte en RFC från IETF). Precis som andra Base85-kodningar gör den om varje grupp om 4 byte till 5 tecken: varje grupp läses som ett 32-bitarstal i big-endian-ordning och skrivs som 5 siffror i bas 85, med den mest signifikanta siffran först. Utdatan blir 25 % större än indatan.

Det som skiljer Z85 från de andra är alfabetet: 0-9, a-z, A-Z och de 23 symbolerna .-:+=^!/*?&<>()[]{}@%$#. Det utelämnar båda citattecknen, bakstrecket, den grava accenten (backtick), kommatecknet, semikolonet, det lodräta strecket, tilden och understrecket. Alfabetet utformades för att vara säkert i strängar i källkod, så ett Z85-värde kan klistras in mellan citattecken i C, Python eller JSON utan några escape-tecken alls.

Var Z85 används

ZeroMQ använder Z85 för att skriva ut CurveZMQ-nycklar. En publik eller hemlig nyckel på 32 byte blir en Z85-sträng på 40 tecken, vilket är den form som zmq_curve_keypair() returnerar och som socketalternativen för CURVE-säkerhet accepterar. Biblioteket har också zmq_z85_encode() och zmq_z85_decode(), och bindningar som pyzmq erbjuder samma funktioner.

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

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

Den sista raden är testvektorn från specifikationen.

Indatans längd: en anmärkning om verktyget

RFC 32 kräver att den binära indatan är en multipel av 4 byte och att den kodade strängen är en multipel av 5 tecken. Den definierar ingen utfyllnad, och strikta implementationer som zmq_z85_encode() vägrar andra längder.

Det här verktyget accepterar även andra längder och använder samma regel som Ascii85 och Base85: en sista grupp på n byte blir n + 1 tecken. Det är ett tillägg utanför standarden. Utdata som skapats på det sättet kan avvisas av andra Z85-avkodare, så fyll ut datan till en multipel av 4 byte när du behöver kompatibilitet. CurveZMQ-nycklar är 32 byte och passar alltid.

Specifikation

Alfabet0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$#
Utdatastorlek5 tecken per 4 byte (125 %)
UtfyllnadIngen
StandardZeroMQ RFC 32
SkiftlägeskänsligJa

Exempel

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

Vanliga frågor

Vad är skillnaden mellan Z85 och Ascii85?
Aritmetiken är densamma, men alfabeten skiljer sig åt. Ascii85 använder ASCII-intervallet från ! till u, som innehåller citattecken och bakstreck, och har förkortningen z för nollbyte. Z85 undviker tecken som måste escapas i strängar och har ingen förkortning.
Använder Z85 utfyllnad?

Nej. Specifikationen tillåter bara indatalängder som är en multipel av 4 byte. Det här verktyget kodar andra längder med en kortare sista grupp, vilket inte ingår i standarden.

Kan jag använda Z85 i JSON, XML eller URL:er?
I JSON-strängar, ja, helt utan escape-tecken. I XML och HTML måste <, > och & escapas. För URL:er passar Z85 dåligt eftersom ?, &, / och # har särskild betydelse där; använd Base64URL eller Base58 i stället.
Hur lång är en Z85-kodad CurveZMQ-nyckel?

En CurveZMQ-nyckel är 32 byte, så den kodas till exakt 40 tecken. Vill du se den råa nyckeln avkodar du den här med Hex som utdata.