Datei hochladen
  1. base64hub
  2. Base64 verstehen
  3. Base64 vs. andere Kodierungen
Erklärung

Base64 vs. Hex, Base32, Base58 und Base85 im Vergleich

Jede Binär-zu-Text-Kodierung wägt Größe gegen Lesbarkeit und den erlaubten Zeichenvorrat ab. Hier dieselbe Eingabe in neun davon, mit ihrem Größenzuwachs und ihrem Zeichenvorrat.

Vergleichstabelle

Alle diese Kodierungen wandeln beliebige Bytes verlustfrei in druckbaren Text und zurück. Sie unterscheiden sich darin, wie viele und welche Zeichen sie verwenden und wie viel größer die Ausgabe wird.

KodierungAlphabetAusgabegrößeSchreibweise relevantURL-sicherTypische Verwendung
Hex (Base16)0-9 a-f200 %NeinJaHashes, MAC-Adressen, Byte-Dumps, Farbcodes
Base32 (RFC 4648)A-Z 2-7, Padding =160 %Nein (laut Spezifikation Großbuchstaben)Ja, ohne =TOTP-Secrets, Tor-Onion-Adressen, DNSSEC (base32hex)
Base58 (Bitcoin)1-9 A-Z a-z ohne 0 O I letwa 137 %JaJaBitcoin-Adressen, IPFS CIDv0 (Qm…), Solana-Schlüssel
Base64A-Z a-z 0-9 + /, Padding =133 %JaNeinE-Mail-Anhänge, Data-URIs, PEM, JSON-Nutzdaten
Base64URLA-Z a-z 0-9 - _133 %JaJaJWT, URL-Tokens, Dateinamen
Ascii85! bis u, dazu z125 %JaNeinPDF- und PostScript-Streams
Z8585 Zeichen inkl. .-:+=^!/*?&<>()[]{}@%$#125 %JaNeinZeroMQ-CURVE-Schlüssel
Base45 (RFC 9285)0-9 A-Z, Leerzeichen, $%*+-./:150 %Nein (nur Großbuchstaben)NeinQR-Codes, digitales COVID-Zertifikat der EU

„Ausgabegröße“ ist die kodierte Länge als Anteil der Eingabelänge bei großen Eingaben. Base64 braucht 4 Zeichen pro 3 Bytes, Base32 8 pro 5, Base85 5 pro 4, Base45 3 pro 2. Base58 hat keine feste Blockgröße, sein Verhältnis ist daher log(256) / log(58), etwa 1,366. Die genauen Zahlen für eine bestimmte Eingabe zeigt der Größenrechner alle auf einmal.

Dieselbe Eingabe in jeder Kodierung

Hier die 12-Byte-ASCII-Zeichenkette Hello world! auf neun Arten kodiert. Zwölf Bytes sind ein Vielfaches von 3 und 4, daher brauchen Base64 und die Base85-Varianten kein Padding.

KodierungAusgabeLänge
Hex48656c6c6f20776f726c642124
Base32JBSWY3DPEB3W64TMMQQQ====24 (20 ohne Padding)
Base32hex91IMOR3F41RMUSJCCGGG====24
Base58 (Bitcoin-Alphabet)2NEpo7TZRhna7vSvL17
Base64SGVsbG8gd29ybGQh16
Base45%69 VD82EK4F.KESTC18
Ascii8587cURD]j7BEbo8015
Z85nm=QNzY<mxA+]nf15
Base85 (RFC 1924 / git)NM&qnZy<MXa%^NF15

Base64URL ist hier identisch mit Base64, weil die Ausgabe kein + und kein / enthält. Der Unterschied zeigt sich nur bei bestimmten Bytes: fb ef be ist in Base64 ++++ und in Base64URL ----.

Pythons Standardbibliothek deckt den Großteil der Tabelle ab. z85encode kam mit Python 3.13 hinzu:

import base64

data = b"Hello world!"
print(data.hex())                           # 48656c6c6f20776f726c6421
print(base64.b32encode(data).decode())      # JBSWY3DPEB3W64TMMQQQ====
print(base64.b64encode(data).decode())      # SGVsbG8gd29ybGQh
print(base64.a85encode(data).decode())      # 87cURD]j7BEbo80
print(base64.b85encode(data).decode())      # NM&qnZy<MXa%^NF
print(base64.z85encode(data).decode())      # nm=QNzY<mxA+]nf

Base58 ist nicht in der Standardbibliothek, passt aber in ein paar Zeilen, weil es eine schlichte Basisumrechnung einer großen Ganzzahl ist:

B58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"

def b58encode(data: bytes) -> str:
    n = int.from_bytes(data, "big")
    out = ""
    while n:
        n, r = divmod(n, 58)
        out = B58[r] + out
    zeros = len(data) - len(data.lstrip(b"\0"))
    return "1" * zeros + out

print(b58encode(b"Hello world!"))   # 2NEpo7TZRhna7vSvL
print(b58encode(b"\0\0\x01"))       # 112

Jedes führende Nullbyte wird zu einer wörtlichen 1, weil sich eine große Ganzzahl führende Nullen nicht merken kann. Deshalb beginnt jede Legacy-Bitcoin-Adresse mit Versionsbyte null mit 1.

Wo welche Kodierung verwendet wird

Hex

Hex braucht zwei Zeichen pro Byte und ist damit die größte Option hier und die am leichtesten lesbare. Jedes Zeichen entspricht genau 4 Bit, das Byte an Position n steht also immer an den Zeichen 2n und 2n+1. Aus diesem Grund sind Hashes, Prüfsummen und Debug-Dumps fast immer Hex. Decoder akzeptieren sowohl DEADBEEF als auch deadbeef. Umwandeln können Sie mit Base64 in Hex und Hex in Base64.

Base32

Base32 verwendet nur Großbuchstaben und die Ziffern 2 bis 7. Es übersteht Systeme ohne Unterscheidung der Schreibweise (DNS-Namen, manche Dateisysteme, Menschen, die Codes ins Handy tippen) und vermeidet 0, 1 und 8, die wie O, I und B aussehen. Authenticator-Apps speichern TOTP-Secrets in Base32, und Tor-v3-Onion-Adressen sind 56 Base32-Zeichen in Kleinbuchstaben. RFC 4648 definiert außerdem base32hex (0-9 A-V), das die Sortierreihenfolge der ursprünglichen Bytes bewahrt. Probieren Sie den Base32-Encoder.

Base58

Base58 entstand mit Bitcoin. Es entfernt 0, O, I und l (leicht verwechselbar) sowie + und / (die die Auswahl per Doppelklick und URLs stören). Bitcoin-Adressen ergänzen ein Versionsbyte und eine 4-Byte-Prüfsumme, ein Format namens Base58Check. Auch IPFS-CIDv0-Hashes sind Base58, und weil sie mit den Multihash-Bytes 12 20 beginnen, fangen sie immer mit Qm an. Da die ganze Eingabe als eine Zahl behandelt wird, wächst die Rechenzeit quadratisch mit der Länge, deshalb wird Base58 für kurze Werte wie Schlüssel und Hashes verwendet. Probieren Sie den Base58-Encoder.

Ascii85, Z85 und Base85 von git

Die Base85-Familie packt 4 Bytes in 5 Zeichen, die dichteste der breit unterstützten Kodierungen. Der Haken ist das Alphabet: 85 druckbare Zeichen bedeuten je nach Variante Anführungszeichen, Backslashes, <, > oder &.

  • Ascii85 (Adobe) verwendet ! bis u, umschließt die Ausgabe mit <~ und ~> und schreibt vier Nullbytes als einzelnes z. PostScript und PDF (der Filter ASCII85Decode) verwenden es.
  • Z85 (ZeroMQ) wählt Zeichen, die in C- und JSON-String-Literalen unbedenklich sind, ohne Anführungszeichen und Backslash. Es verlangt eine Eingabelänge, die ein Vielfaches von 4 ist. Ein 32-Byte-CURVE-Schlüssel hat 40 Zeichen.
  • Base85 nach RFC 1924 war ein Aprilscherz-Vorschlag für IPv6-Adressen. Sein Alphabet lebt in binären Patches von git und in Pythons b85encode weiter.

Das Base85-Tool beherrscht alle drei; Z85 hat eine eigene Seite.

Base45

Base45 gibt es wegen QR-Codes. Der alphanumerische Modus eines QR-Codes speichert genau 45 Zeichen (Ziffern, Großbuchstaben, Leerzeichen und $%*+-./:) mit je 5,5 Bit, gegenüber 8 Bit pro Zeichen im Byte-Modus. Base45 macht aus 2 Bytes 3 dieser Zeichen, was im QR-Code etwa 3 % kostet. Base64-Text muss den Byte-Modus nutzen und kostet 33 %. Das digitale COVID-Zertifikat der EU verwendete Base45 genau aus diesem Grund. Probieren Sie den Base45-Encoder.

Die richtige Wahl

Wählen Sie die Kodierung, die die Gegenseite erwartet. Eine JWT-Bibliothek will Base64URL, eine Authenticator-App Base32, ein Bitcoin-Wallet Base58Check. Wenn Sie beide Enden kontrollieren, gelten diese Faustregeln:

  • Bytes in JSON, XML, E-Mails oder HTTP-Bodys: Base64. Jede Sprache hat eine schnelle eingebaute Implementierung, und 33 % Overhead sind vertretbar.
  • In einer URL, einem Cookie oder einem Dateinamen: Base64URL ohne Padding.
  • Menschen lesen, tippen oder vergleichen den Wert: Hex für kurze Hashes, Base32, wenn die Schreibweise verloren gehen kann, Base58, wenn es kompakt aussehen und keine verwechselbaren Zeichen haben soll.
  • Jedes Byte zählt, und Sie kontrollieren den Decoder: Z85 oder Ascii85.
  • QR-Codes: Base45.

Der Kompromiss ist immer derselbe: Ein größeres Alphabet ergibt kürzere Ausgaben und mehr Zeichen, die irgendwo maskiert werden müssen. Warum Base64 um ein Drittel wächst, erklärt Der Größen-Overhead von Base64. Zur URL-sicheren Variante siehe Base64 vs. Base64URL.

Häufige Fragen

Welche Binär-zu-Text-Kodierung ist am kompaktesten?

Unter den gängigen Base85 (Ascii85 und Z85) mit 25 % Overhead, dann Base64 mit 33 %. basE91 schafft etwas mehr, wird aber selten unterstützt. Falls Sie es brauchen, siehe das Base91-Tool.

Warum verwendet Bitcoin Base58 statt Base64?

Base58 lässt 0, O, I, l, + und / weg, Adressen lassen sich also leichter vorlesen, von Hand abschreiben und per Doppelklick in einem Textfeld markieren. Der Preis ist eine langsamere Umrechnung großer Zahlen, die bei 25-Byte-Adressen keine Rolle spielt.

Spielt die Schreibweise bei Base32 und Base58 eine Rolle?

Das Alphabet von RFC 4648 besteht aus Großbuchstaben, und strenge Decoder lehnen Kleinbuchstaben ab. Viele akzeptieren beides: Python braucht dafür casefold=True. Base58 unterscheidet Groß- und Kleinschreibung: a und A sind verschiedene Ziffern. Hex ist in praktisch jedem Decoder unabhängig von der Schreibweise.

Kann ich Base64 direkt in Base58 oder Base32 umwandeln?

Ja, indem Sie in Bytes dekodieren und erneut kodieren. Die Konverter Base64 in Base58 und Base64 in Base32 erledigen beide Schritte lokal in Ihrem Browser.

Weiterlesen