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.
| Kodierung | Alphabet | Ausgabegröße | Schreibweise relevant | URL-sicher | Typische Verwendung |
|---|---|---|---|---|---|
| Hex (Base16) | 0-9 a-f | 200 % | Nein | Ja | Hashes, 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 l | etwa 137 % | Ja | Ja | Bitcoin-Adressen, IPFS CIDv0 (Qm…), Solana-Schlüssel |
| Base64 | A-Z a-z 0-9 + /, Padding = | 133 % | Ja | Nein | E-Mail-Anhänge, Data-URIs, PEM, JSON-Nutzdaten |
| Base64URL | A-Z a-z 0-9 - _ | 133 % | Ja | Ja | JWT, URL-Tokens, Dateinamen |
| Ascii85 | ! bis u, dazu z | 125 % | Ja | Nein | PDF- und PostScript-Streams |
| Z85 | 85 Zeichen inkl. .-:+=^!/*?&<>()[]{}@%$# | 125 % | Ja | Nein | ZeroMQ-CURVE-Schlüssel |
| Base45 (RFC 9285) | 0-9 A-Z, Leerzeichen, $%*+-./: | 150 % | Nein (nur Großbuchstaben) | Nein | QR-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.
| Kodierung | Ausgabe | Länge |
|---|---|---|
| Hex | 48656c6c6f20776f726c6421 | 24 |
| Base32 | JBSWY3DPEB3W64TMMQQQ==== | 24 (20 ohne Padding) |
| Base32hex | 91IMOR3F41RMUSJCCGGG==== | 24 |
| Base58 (Bitcoin-Alphabet) | 2NEpo7TZRhna7vSvL | 17 |
| Base64 | SGVsbG8gd29ybGQh | 16 |
| Base45 | %69 VD82EK4F.KESTC | 18 |
| Ascii85 | 87cURD]j7BEbo80 | 15 |
| Z85 | nm=QNzY<mxA+]nf | 15 |
| Base85 (RFC 1924 / git) | NM&qnZy<MXa%^NF | 15 |
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
!bisu, umschließt die Ausgabe mit<~und~>und schreibt vier Nullbytes als einzelnesz. PostScript und PDF (der FilterASCII85Decode) 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
b85encodeweiter.
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.