Base62-Kodierung / -Dekodierung

Wandeln Sie eine Zahl oder eine Bytefolge mit Base62 um: 62 Zeichen aus Ziffern, Groß- und Kleinbuchstaben, von denen keines in einer URL-Abfrage oder im HTML-Text maskiert werden muss. Deshalb werden Kurzlinks und automatisch hochzählende IDs so geschrieben. Zwei Modi: eine Dezimalzahl (eine ID wird zu einem Kurzcode) und Bytes (Text- oder Hex-Eingabe). Außerdem: Base64 | Base32 / Base58 | Base91.
Die gesamte Verarbeitung findet lokal in Ihrem Browser statt — Ihre Daten werden nie auf einen Server hochgeladen.

Noch nie von Base62 gehört? Was ist Base62 — in einfachem Deutsch erklärt (mit durchgerechneten Beispielen, den drei Alphabeten und den Fallen).
Alphabet:
Ergebnis auf feste Breite auffüllen: 0 = keine Auffüllung. Die Auffüllung wiederholt das Nullzeichen des gewählten Alphabets, deshalb wird dieselbe Zahl im Alphabet Buchstaben-zuerst anders aufgefüllt.
So funktioniert es:
Eingabe ist:
So funktioniert es:
Ausgabe als:
Strg+Eingabe im Eingabefeld führt den aktiven Modus aus.
Wählen Sie Kodieren oder Dekodieren und klicken Sie auf die Aktionsschaltfläche. Der Selbsttest führt jedes dokumentierte Beispiel aus, jede Bytelänge von 0 bis 64 Byte und eine Auswahl von Dezimalzahlen durch alle drei Alphabete und meldet die Anzahl hier.
Die drei Alphabete, vollständig gedruckt: Hinter Base62 steht keine Normungsorganisation, daher ist das Alphabet zwischen den Implementierungen nicht garantiert. Hier sind die drei Reihenfolgen, die tatsächlich vorkommen; jede ist Zeichen für Zeichen mit ihrem Wert gedruckt, sodass sich jedes Ergebnis auf das genaue Alphabet zurückverfolgen lässt, das es erzeugt hat. Die schattierte Zelle ist das Zeichen, das Null bedeutet; es ist nicht in allen drei dasselbe.
Base62 unterscheidet in allen drei Reihenfolgen zwischen Groß- und Kleinschreibung: ein Großbuchstabe und seine Kleinschreibung bezeichnen fast immer verschiedene Werte, daher ist ein Code, der eine Kleinschreibung durchlaufen hat, eine andere Zahl und kein Fehler.
Base62 unterscheidet in jeder der drei Reihenfolgen zwischen Groß- und Kleinschreibung: Ein Großbuchstabe und seine Kleinbuchstabenform bezeichnen fast immer verschiedene Werte, daher ist ein Code, der einen Kleinschreibungsschritt durchlaufen hat, eine andere Zahl — kein Fehler.
Länge derselben Bytes in jeder Kodierung:
Wie groß eine Eingabe diese Seite annimmt, und warum: Jeder Modus hier rechnet über eine einzige große Ganzzahl, und die Umwandlung großer Ganzzahlen kostet Zeit proportional zum Quadrat der Länge. Das ist eine Eigenschaft des Formats selbst und nicht dieser Seite: Jedes Werkzeug, das echtes Base62 umsetzt, hat dieselbe Art von Grenze. Die folgenden Zahlen stammen aus einem Zeitmessgerät, das die eigenen Routinen der Seite ausführt und nicht einen laufenden Tab; sie sind bewusst eher pessimistisch: Ein Desktop-Browser ist meist mehrfach schneller, und dieser Spielraum deckt einen langsamen Telefon-Browser ab. Die Grenzen sind so gesetzt, dass selbst der langsame Fall abgeschlossen wird, statt den Tab einzufrieren.
Oberhalb der weichen Grenze erklärt der erste Klick die Kosten und verlangt einen zweiten Klick, bevor die Berechnung läuft; oberhalb der harten Grenze verweigert die Seite die Verarbeitung, statt den Tab für mehrere Sekunden einzufrieren, ohne Fortschritt anzuzeigen. Der Bytemodus zählt beim Kodieren in Bytes und beim Dekodieren in Zeichen, und es wird immer die größere Zahl verwendet: 2.048 Bytes ergeben ausgedruckt etwa 2.751 Zeichen, das liegt über der Zeichengrenze; eine Nutzlast von etwa 1.520 Bytes oder weniger übersteht daher auf dieser Seite einen Hin- und Rückweg. Für reine Binärdaten beliebiger Größe sind Base64 und Base91 linear und haben keine solche Grenze.
Was ist Base62?

Base62 ist eine Art, eine Zahl nur mit Zeichen zu schreiben, die überall eingefügt werden können: den zehn Ziffern, den 26 Großbuchstaben und den 26 Kleinbuchstaben. Keine Satzzeichen, keine Leerzeichen, kein Auffüllzeichen, nichts, was vor dem Einfügen in eine URL, einen Dateinamen, ein Cookie oder einen Datenbankschlüssel maskiert werden müsste. Zehn plus 26 plus 26 ergibt 62, und daher kommt der Name.

Die Version in 30 Sekunden: Die Zahl 12345 wird als 3D7 geschrieben, und 1234567890 als 1LY7VK. Der Rückweg ist dieselbe Operation in umgekehrter Richtung und braucht das genaue Alphabet, das den Code erzeugt hat — ein anderes Alphabet macht aus denselben sechs Zeichen eine andere Zahl, ohne jede Fehlermeldung.

Diese Seite erfüllt zwei verwandte Aufgaben, und der Unterschied zwischen ihnen ist wichtiger als alles andere auf dieser Seite:

  • Ganzzahlmodus behandelt die Eingabe als Zahl. Eine Dezimal-ID wie 1234567890 wird zu 1LY7VK, und die führenden Nullen der Eingabe gehören nicht zum Wert, kommen also beim Zurückrechnen nicht wieder.
  • Bytemodus behandelt die Eingabe als Bytefolge. Die Bytes werden als eine riesige Ganzzahl in Big-Endian gelesen und dann durch 62 geteilt — dieselbe Rechnung, nur auf einer anderen Größe. Hier bleibt die Anzahl führender Nullbytes erhalten, ein Nullbyte pro Nullzeichen.
Woher die 62 kommt und was sie kostet

62 ist keine Zweierpotenz, und diese eine Tatsache bestimmt alles Weitere. Die bekannten Kodierungen werden gebaut, indem die Eingabe in feste Bitgruppen geschnitten wird: 4 Bit ergeben ein hexadezimales Zeichen, 6 Bit ein Base64-Zeichen, 5 Bit ein Base32-Zeichen. Base62 kann das nicht, denn keine ganze Zahl von Bit passt zu einem Zeichen mit 62 Werten — 5 Bit benennen nur 32 Werte, 6 Bit 64. Base62 geht deshalb über Arithmetik: Die ganze Eingabe wird als eine Ganzzahl gelesen und zur Basis 62 ausgegeben.

Ein Zeichen trägt dann log2(62) = 5,954 Bit, sehr nah an Base64 mit 6 Bit; im Dezimalmodus ersetzt ein Zeichen log62(10) = 1,792 Dezimalstellen. Einige Folgen sollten Sie kennen, bevor Sie eine Länge wählen:

CodelängeBenennbare WerteIn der Praxis
4 Zeichen624 = 14.776.336Genug für einen Zähler, der unter acht Stellen bleibt, und er passt in den Platz einer Telefonnummer.
6 Zeichen626 = 56.800.235.584Die übliche Form eines ID-Codes. Eine zehnstellige Dezimal-ID passt in sechs Zeichen.
7 Zeichen627 = 3.521.614.606.208Über den Bereich eines 32-Bit-Zählers hinaus, um zwei Größenordnungen, in der Breite eines Kurzlink-Slugs.
11 Zeichen6211 = 52.036.560.683.837.093.888Mehr als 264 = 18.446.744.073.709.551.616, sodass eine volle 64-Bit-Zahl in elf Zeichen passt.

Umgekehrt brauchen 1.000 Dezimalstellen etwa 558 Zeichen, und 4.096 Dezimalstellen brauchen 2.285. Die Einsparung ist real, aber begrenzt: Base62 verkürzt eine Dezimalzahl um etwa 44%, und es schlägt nie die dichtesten druckbaren Kodierungen, weil 5,954 Bit pro Zeichen schlicht weniger sind als 6,4 oder 6,5.

Ganzzahlmodus: was mit führenden Nullen geschieht

Eine Ganzzahl hat eine einzige kanonische Schreibweise, und sie beginnt mit dem Nullzeichen des Alphabets, das 0 ist in den beiden Ziffern-zuerst-Reihenfolgen und A in der Buchstaben-zuerst-Reihenfolge. Alles links vom ersten signifikanten Zeichen ist Auffüllung, und Auffüllung gehört nicht zum Wert: 00012345 und 12345 werden beide zu 3D7. Wenn eine feste Breite gewünscht ist — etwa ein siebenstelliger Code, der in einer Spalte ausgerichtet sein muss —, wiederholt das Feld Ergebnis auf feste Breite auffüllen Nullzeichen, bis die Breite erreicht ist. So ergibt 12345 bei Breite 7 im Alphabet Ziffern-zuerst 00003D7 und im Alphabet Buchstaben-zuerst AAAADNH. Die Auffüllung ist kosmetisch: Diese führenden Zeichen tragen nichts zum Wert bei, und beide Zeichenketten ergeben beim Dekodieren 12345, weil 0 × 626 und 0 × 625 beide null sind, egal welches Zeichen die Null schreibt.

Eine aufgefüllte Zeichenkette lässt sich daher auch dekodieren, und die Seite meldet, wie viele der führenden Zeichen Nullzeichen waren, damit der Unterschied zwischen „der Code hat sieben Zeichen“ und „der Wert brauchte drei Zeichen“ nie ein Rätsel bleibt.

Bytemodus: dieselbe Rechnung auf einer Bytefolge

Der Bytemodus liest die Eingabebytes als eine Ganzzahl in Big-Endian — die ganze Bytefolge wird als eine einzige Zahl behandelt, egal wie lang sie ist — und gibt diese Zahl zur Basis 62 aus. Da ein Byte 8 Bit enthält und ein Zeichen davon 5,954 benennt, ist der Bytemodus keine Kompression: Er braucht etwa 134% der Eingabegröße, etwas schlechter als Base64 mit 133%. Bei der 92-Byte-Probe aus der Größentabelle oben ergeben 92 Byte 124 Base62-Zeichen, und Base64 ergibt ebenfalls 124 (davon 123 vor der =-Auffüllung). Base62 verliert gegen Base64 bei der Dichte und gewinnt bei der Zeichensicherheit — ein Tausch, den jeder Kurzlink und jeder Einladungscode bewusst eingeht.

Führende Nullbytes bleiben erhalten, und das lässt sich in beide Richtungen leicht falsch machen. Zwei führende Nullbytes gefolgt von 0x01 ergeben 001 im Alphabet Ziffern-zuerst und AAB im Alphabet Buchstaben-zuerst, weil die führenden Zeichen die Null schreiben, einmal pro Nullbyte. Eine Bytefolge aus einem einzigen 0x00 wird zum einzelnen Zeichen 0, und eine Bytefolge aus einem einzigen 0x01 wird zu 1. Hier unterscheiden sich der Bytemodus und der Ganzzahlmodus, obwohl sie denselben Algorithmus verwenden.

Der Preis dafür: Der Bytemodus erbt die quadratische Laufzeit der Rechnung. 1.024 Byte brauchen geschätzt etwa eine Drittelsekunde und 2.048 Byte etwa 1,3 Sekunden — dieselben Werte, die die Grenzwerttabelle oben nennt. Deshalb ist der Bytemodus hier auf 2.048 Byte bei der Eingabe und 2.048 Zeichen bei der Rückgabe begrenzt. 2.048 Byte ergeben etwa 2.751 Zeichen, daher ist etwa 1.520 Byte die größte Nutzlast, die eine Hin-und-zurück-Umwandlung auf dieser Seite übersteht. Deshalb ist der Bytemodus hier eine Referenz für kleine Werte und kein Ersatz für Base64 oder Base91 bei echten Dateien.

Die drei Alphabete — und warum das Alphabet die ganze Geschichte ist

Die Zeichen eines Alphabets bilden eine feste Folge, und der Wert eines Zeichens ist seine Position in dieser Folge. Verschiebt man die Folge, ändert sich die Bedeutung jedes Zeichens. Drei Reihenfolgen sind weit verbreitet; hier ist dieselbe Zahl, dreimal geschrieben:

Dezimal0-9, dann A-Z, dann a-z0-9, dann a-z, dann A-ZA-Z, dann a-z, dann 0-9
000A
61zZ9
621010BA
12.3453D73d7DNH
1.234.567.8901LY7VK1ly7vkBViHfU

Liest man die letzten drei Spalten als ein Alphabet, ergibt sich ein einheitliches Schema. Liest man sie als austauschbar, bricht es zusammen, denn das Dekodieren ist im schlimmsten Sinn alphabetblind: Jedes Zeichen der Eingabe steht in allen drei Alphabeten, daher erzeugt ein falsches Alphabet gar keinen Fehler, sondern nur eine andere Zahl.

Ein CodeGelesen als 0-9 A-Z a-zGelesen als 0-9 a-z A-ZGelesen als A-Z a-z 0-9
3D712.34513.957211.665
1LY7VK1.234.567.8901.624.950.79248.723.527.772

Die Groß- und Kleinschreibung ist eine zweite, schärfere Version derselben Falle. Base62 unterscheidet in jeder Reihenfolge zwischen Groß- und Kleinschreibung, daher verändert das Kleinschreiben eines Codes ihn stillschweigend: 1LY7VK ist 1.234.567.890 im Alphabet Ziffern-zuerst, während 1ly7vk im selben Alphabet 1.624.950.792 ist — und im Alphabet Ziffern-dann-Kleinbuchstaben ist es zufällig 1.234.567.890, weil diese Reihenfolge genau die Ziffern-zuerst-Reihenfolge mit vertauschten Buchstabenschreibweisen ist. Auch das Nullzeichen ist nicht überall gleich: Die beiden Ziffern-zuerst-Reihenfolgen schreiben die Null als 0, die Buchstaben-zuerst-Reihenfolge als A, sodass dieses Alphabet überhaupt nicht mit einer Ziffer beginnt.

Base62 neben den anderen Kodierungen
KodierungBit pro ZeichenGröße gegenüber der EingabeHinweise
Base16 (Hex)4200%Zwei Zeichen pro Byte, völlig lesbar, kein Alphabet nachzuschlagen.
Base325160%Groß-/Kleinschreibungsunabhängig und sicher beim Diktieren, die verschwenderischste der Gruppe.
Base36 (0-9 a-z)~5,17~155%Nur Ziffern und Kleinbuchstaben, überlebt daher eine Kleinschreibung. 12345 ist 9ix.
Base58~5,86~137%Für Adressen gewählt, nicht für Dichte: Vier leicht verwechselbare Zeichen werden weggelassen statt sortiert. Siehe Base32 / Base58.
Base62~5,95~134%Jedes Zeichen ist eine Ziffer oder ein Buchstabe, daher wird nie etwas maskiert. Die Dichte liegt zwischen Base58 und Base64.
Base646133%überall der Standard, um den Preis von +, / und =, den drei Zeichen, die eine Maskierung erzwingen. Siehe Base64-Konverter.
Ascii85 / Base856,4125%5 Zeichen pro 4 Byte, teilt aber durch 85, und sein Alphabet muss maskiert werden. Siehe Ascii85.
Base91~6,5~123%Die dichteste dieser Kodierungen, und diejenige, deren Ausgabe am wenigsten sicher ohne Maskierung eingefügt werden kann. Siehe Base91.

Die Prozentwerte sind gerundete asymptotische Kosten; die gemessenen Zeichenanzahlen für eine echte 92-Byte-Eingabe stehen in der Größentabelle weiter oben auf dieser Seite. Im Ganzzahlmodus verläuft der Vergleich umgekehrt, weil die Eingabe Dezimaltext und nicht Bytes ist: Dort ist Base62 etwa 44% kürzer als die Ziffern, die es ersetzt, und Base36 etwa 36% kürzer. Deshalb ist ein ID-Code normalerweise Base62 oder Base36 und nicht Base58.

Was Base62 nicht ist
  • Kein Standard. Es gibt keinen RFC und keine Spezifikation. Keine Normungsorganisation hat Base62 je definiert, deshalb ist das Alphabet nicht festgelegt, und diese Seite nennt alle drei Reihenfolgen, statt stillschweigend eine auszuwählen.
  • Keine Verschlüsselung. Es ist ein Basiswechsel, nichts weiter. Wer das Alphabet kennt, kehrt es in einem Durchgang um; es gibt keinen Schlüssel, kein Salt und keinerlei Geheimhaltung.
  • Keine Kompression. Der Bytemodus vergrößert die Daten um etwa ein Drittel. Der Ganzzahlmodus sieht nur deshalb wie Kompression aus, weil Dezimaltext von vornherein eine ineffiziente Schreibweise für eine Zahl ist.
  • Nicht groß-/kleinschreibungsunabhängig. Base32 kann in Kleinbuchstaben geschrieben und zurückgelesen werden, Base62 nicht. Ein Code, der durch ein System läuft, das die Schreibweise vereinheitlicht, ist ein beschädigter Code.
  • Nicht selbstprüfend. Es gibt keine Prüfsumme und kein Prüfzeichen; ein einziges falsches Zeichen ergibt ein gültig aussehendes Ergebnis mit einem anderen Wert. Wenn das wichtig ist, bietet die Bitcoin-Reihenfolge eine Prüfsumme — siehe den Abschnitt Base58Check auf Base32 / Base58.
  • Keine feste Länge. Die Zeichenanzahl wächst mit dem Wert; ein Zähler, der bei 1 beginnt und 627 erreicht, geht von einem Zeichen auf acht. Füllen Sie auf eine feste Breite auf, wenn eine stabile Spalte gebraucht wird.
Fallen, die tatsächlich beißen
  • Das Alphabet beantwortet neun von zehn Rätseln. Wenn ein anderes Werkzeug für dieselbe Zahl einen anderen Code ausgibt, vergleichen Sie zuerst die beiden Alphabete Zeichen für Zeichen, bevor Sie einen Fehler vermuten. Die Tabelle oben zeigt denselben Wert in drei Alphabeten, und alle drei sind richtig.
  • Ein falsches Alphabet scheitert stillschweigend. Dafür gibt es keinen Fehlerpfad: 3D7 wird zu 12.345, 13.957 oder 211.665, je nachdem, welche Reihenfolge angenommen wird. Prüfen Sie das erste Zeichen, das am ehesten eine Nullauffüllung ist, und ob das Alphabet vorn Ziffern oder Buchstaben hat.
  • Führende Nullen bedeuten zwei verschiedene Dinge. Im Ganzzahlmodus sind 00012345 und 12345 dieselbe Zahl und werden gleich ausgegeben. Im Bytemodus ist ein führendes Nullbyte Daten und wird als ein zusätzliches Nullzeichen geschrieben. Wenn man eines dieser Zeichen weglässt, ändert sich die Bytefolge.
  • Die Normalisierung der Schreibweise zerstört einen Code. Eine E-Mail-Adresse, ein Hostname oder ein Windows-Pfad kann unterwegs in Kleinbuchstaben umgewandelt werden. Ein Base62-Code übersteht das nicht — deshalb gibt es Base36 noch.
  • Lange Eingaben sind langsam, nicht nur groß. Die Umwandlung ist Arithmetik auf der gesamten Eingabe auf einmal; verdoppelt man die Länge, vervierfacht sich die Zeit. Diese Seite lehnt Eingaben oberhalb ihrer gemessenen Grenzen ab, statt zu hängen; die Größentabelle weiter oben nennt die gemessenen Werte.
  • Eine Base62-Zeichenkette beweist nichts. Da fast jede Zeichenkette aus Ziffern und Buchstaben ohne Beanstandung dekodiert wird, ergibt jeder beliebige URL-Slug irgendeine Zahl. Ein Code bedeutet nur etwas, wenn das System, das ihn ausgegeben hat, auch die Zuordnung speichert.
Kurze Antworten

„Warum gibt ein anderes Base62-Werkzeug für dieselbe Zahl einen anderen Code aus?“

Weil sich das Alphabet unterscheidet. Base62 hat keine Spezifikation, mit der die Implementierungen übereinstimmen müssten, also wählt jede eine Reihenfolge: Ziffern und Großbuchstaben zuerst, Ziffern und Kleinbuchstaben zuerst oder Buchstaben vor den Ziffern. Wechseln Sie oben auf dieser Seite die Alphabet-Auswahl, um alle drei Antworten nebeneinander zu sehen.

„Ist Base62 in einer URL sicher?“

Ja, in allen drei Reihenfolgen. Alle 62 Zeichen sind unmaskierte Buchstaben und Ziffern, daher wird keines davon in einer Abfrage-Zeichenkette zu einer Prozent-Dreiergruppe, und keines beendet eine URL, ein Pfadsegment oder ein HTML-Attribut. Genau deshalb sind Kurzlinks in Base62 und nicht in Base64 geschrieben.

„Was ist kleiner, Base62 oder Base64?“

Bei Bytes ist Base64 etwas kleiner: etwa 133% der Eingabe gegenüber etwa 134%. Bei der 92-Byte-Probe oben stehen beide bei 124 Zeichen gleichauf. Bei Dezimalzahlen verkürzt Base62 den Text um etwa 44%, und dort liegt der praktische Gewinn.

„Kann ich mit dieser Seite eine Base64-Zeichenkette dekodieren?“

Nein, und es meldet auch nicht, dass es gescheitert ist. Die beiden Alphabete überlappen sich in allen 62 Zeichen, daher ist eine Base64-Zeichenkette hier meist ebenfalls „gültige“ Eingabe und wird einfach zu einer anderen Zahl dekodiert. Verwenden Sie Base64 für Base64.

„Hat ein Base62-Code eine maximale Länge?“

Nein. Theoretisch hat der Algorithmus keine Grenze. In der Praxis endet diese Seite bei 4.096 Dezimalstellen oder 2.048 Byte, weil die Rechnung dahinter quadratisch ist und der Tab sonst einfriert, ohne dass etwas auf dem Bildschirm erklärt, warum. Die Grenzwerttabelle weiter oben auf dieser Seite nennt die gemessenen Zahlen.

„Woher weiß ich, dass das Ergebnis dieser Seite stimmt?“

Drücken Sie Selbsttest. Er führt jedes dokumentierte Beispiel aus, jede Bytelänge von 0 bis 64 und eine Auswahl von Dezimalzahlen durch alle drei Alphabete, vergleicht die zurückgegebenen Werte mit der Eingabe und prüft erneut, dass alle 62 Zeichen jedes Alphabets in einer URL unbedenklich sind. Die Schaltfläche Beispiel vergleicht zusätzlich ihre drei Ergebnisse mit den Werten, die in der Datendatei dieser Seite festgehalten sind; diese wurden gegen eine zweite, unabhängige Ganzzahl-Implementierung im Testwerkzeug dieser Website geprüft.

Normen und Herkunft

Hier gibt es keinen Standard, den man umsetzen könnte: Base62 ist eine Konvention, keine Spezifikation, und die drei oben gedruckten Alphabete sind diejenigen, die in echter Software vorkommen. Diese Seite setzt sie mit den eigenen Routinen der Website für große Ganzzahlen um, geschrieben als reine Arithmetik auf Ziffernfeldern, damit keine Größe je durch den Zahlentyp von JavaScript begrenzt wird.

Der Seitentext wurde für diese Website geschrieben. Jedes durchgerechnete Beispiel auf dieser Seite wurde mit dem eigenen Code der Seite erzeugt und dann gegen eine zweite, unabhängige Implementierung mit nativen großen Ganzzahlen geprüft, die im Testwerkzeug dieser Website liegt; dieselbe Implementierung hat auch die Beispiel- und Größentabellen in der Datendatei verifiziert.