Base85-encoder en -decoder

Zet tekst, hex-bytes of bestanden om naar Base85 en terug. Deze pagina gebruikt de tekenset uit RFC 1924: de variant die Python b85encode oplevert en die Git in binaire patches gebruikt.

Werkt volledig in je browser. Er wordt niets geüpload.

Zo gebruik je het

  1. Kies Coderen om tekst of bytes naar Base85 om te zetten, of Decoderen om Base85 terug te zetten naar gegevens.
  2. Typ of plak je invoer, of gebruik Bestand openen. Zet Invoer als op Hex als je met ruwe bytes werkt.
  3. Het resultaat wordt bijgewerkt terwijl je typt. Zet bij het decoderen Uitvoer als op Tekst of Hex, afhankelijk van wat de gegevens bevatten.
  4. Kopieer het resultaat met Kopiëren of sla het met Downloaden op als bestand.

Wat is Base85?

Base85 is een familie van coderingen die elke 4 bytes omzetten in 5 tekens. Vijf cijfers in grondtal 85 kunnen 85 × 85 × 85 × 85 × 85 = 4.437.053.125 waarden bevatten, net genoeg voor elk 32-bitsgetal. Daardoor is de uitvoer maar 25% groter dan de invoer, tegenover 33% bij Base64.

Er bestaan meerdere Base85-alfabetten en die zijn niet uitwisselbaar: Ascii85 (Adobe, PDF), Z85 (ZeroMQ) en het alfabet op deze pagina. Dat gebruikt 0-9, A-Z, a-z en 23 symbolen: !#$%&()*+-;<=>?@^_`{|}~. De aanhalingstekens, komma, punt, slash, dubbele punt, backslash en vierkante haken zijn weggelaten.

RFC 1924, Git en Python

De tekenset komt uit RFC 1924, "A Compact Representation of IPv6 Addresses", die op 1 april 1996 als 1-aprilgrap werd gepubliceerd. Daarin werd voorgesteld om een 128-bits IPv6-adres te schrijven als één getal in grondtal 85 van precies 20 tekens. Niemand schrijft IPv6-adressen zo, maar het alfabet werd later hergebruikt voor algemene binaire gegevens:

  • Git slaat binaire bestanden in patches (git diff --binary, git format-patch) op als met zlib gecomprimeerde gegevens die met dit alfabet zijn gecodeerd, met een lengteteken aan het begin van elke regel.
  • Python 3.4 en hoger biedt base64.b85encode() en b85decode(), waarvan de uitvoer overeenkomt met deze tool.
  • Mercurial gebruikt dezelfde codering voor binaire bestanden in diffs in Git-stijl.

Let op: RFC 1924 zet het hele 128-bits adres in één keer om, terwijl Git, Python en deze tool met groepen van 4 bytes werken. Een waarde van 16 bytes geeft daardoor een ander resultaat dan de methode uit de RFC.

Korte laatste groepen

Als de invoerlengte geen veelvoud van 4 is, wordt de laatste groep aangevuld met nulbytes en gecodeerd, waarna alleen de eerste n + 1 tekens worden bewaard: 1 byte wordt 2 tekens, 2 bytes worden 3 en 3 bytes worden 4. De decoder draait dit om, dus er zijn geen opvultekens nodig. Deze variant heeft geen afkorting voor nulbytes, anders dan de z van Ascii85.

# Python 3.4+
import base64
base64.b85encode(b'hello')      # b'Xk~0{Zv'
base64.b85decode(b'Xk~0{Zv')    # b'hello'

Specificatie

Alfabet0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~
Uitvoergrootte5 tekens per 4 bytes (125%)
OpvullingGeen
StandaardTekenset van RFC 1924 (Git, Python b85)
HoofdlettergevoeligJa

Voorbeelden

Invoer (UTF-8)Uitvoer
Hello, World!NM&qnZ!92JZ*pv8Ap
Base64.isLSb`dHZ(42a{
你好<h`KfrM&

Veelgestelde vragen

Is Base85 hetzelfde als Ascii85?
Ze gebruiken dezelfde rekenmethode maar andere tekens, dus hun uitvoer verschilt. Ascii85 kort bovendien vier nulbytes af tot z en kan tussen Adobe-begrenzers staan. Gebruik de pagina Ascii85 voor PDF- en PostScript-gegevens.
Was RFC 1924 een echte standaard?

Nee. Het is een informatieve RFC die als 1-aprilgrap werd gepubliceerd en nooit voor IPv6-adressen is gebruikt. De tekenset werd later populair via Git en Python.

Hoeveel groter is Base85-uitvoer?
Elke 4 bytes worden 5 tekens, dus de uitvoer is 1,25 keer zo groot als de invoer. Bij Base64 is dat ongeveer 1,33 keer. basE91 is nog iets compacter.
Kan ik Base85 in JSON of XML zetten?
In JSON wel: het alfabet bevat geen dubbel aanhalingsteken of backslash, dus er hoeft niets te worden ge-escapet. In XML en HTML moeten de tekens <, > en & worden ge-escapet. Base85 is niet URL-veilig.