So kodieren und dekodieren Sie Ascii85
- Geben Sie Text in Eingabe · Text ein oder fügen Sie ihn ein. Das Ascii85 erscheint in Ausgabe · Ascii85 (Adobe).
- Aktivieren Sie unter der Ausgabe Begrenzer <~ ~> hinzufügen für die PostScript-/PDF-Rahmung, und deaktivieren Sie z für Nullgruppen, wenn Ihr Decoder die Abkürzung nicht kennt.
- Für ein anderes Base85-Alphabet stellen Sie Nach auf Base85 (Git / Python b85), Z85 (ZeroMQ) oder RFC 1924 (IPv6 Base85).
- Zum Dekodieren klicken Sie im Richtungsschalter auf Ascii85 (Adobe) → Text. Der Decoder akzeptiert die Begrenzer
<~ ~>,z,yund beliebigen Leerraum, umbrochene Daten aus einer Datei lassen sich also direkt einfügen. - Bei binären Ergebnissen stellen Sie Nach auf Hex oder klicken auf Bytes speichern.
So funktioniert Ascii85
Ascii85 nimmt jeweils 4 Bytes, liest sie als eine 32-Bit-Zahl in Big-Endian und schreibt sie als 5 Ziffern zur Basis 85. Jede Ziffer ist ein Zeichen von ! (Wert 0) bis u (Wert 84). Fünf Zeichen für vier Bytes ergeben 25 % Overhead, gegenüber 33 % bei Base64.
Das klassische Beispiel ist Man (mit Leerzeichen am Ende): Die Bytes 4d 61 6e 20 werden zu 9jqo^. Ist die letzte Gruppe kürzer, füllt der Encoder sie mit Nullbytes auf und schreibt für n Bytes nur n + 1 Zeichen, so wird Hello (5 Bytes) zu 87cURDZ: fünf Zeichen für Hell und zwei für o.
Zwei Abkürzungen verkürzen häufige Muster. z ersetzt eine Gruppe aus vier Nullbytes, ausgeschrieben !!!!!. y ersetzt in der btoa-Variante vier Leerzeichen. Dieser Decoder liest beide, der Encoder schreibt z (abschaltbar), aber nie y.
Base85-Varianten im Vergleich
| Variante | Alphabet | Hello | Wo sie verwendet wird |
|---|---|---|---|
| Ascii85 (Adobe) | ! bis u in ASCII-Reihenfolge | 87cURDZ | PostScript, PDF /ASCII85Decode |
| Base85 (Git / Python) | 0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~ | NM&qnZv | Binär-Patches in Git, Python base64.b85encode |
| Z85 | 0-9 a-z A-Z .-:+=^!/*?&<>()[]{}@%$# | nm=QNzV | Schlüssel in ZeroMQ und CurveZMQ, siehe Z85 |
| RFC 1924 | Wie Git | 4)+k&C#VzJ4br>0wv%Yp für eine IPv6-Adresse | IPv6-Adressen, als Scherz |
Die Alphabete von Git und RFC 1924 sind identisch, aber RFC 1924 behandelt eine ganze 16-Byte-Adresse als eine 128-Bit-Zahl statt als vier 4-Byte-Gruppen. RFC 1924 erschien am 1. April 1996 und schlägt vor, 1080::8:800:200c:417a als 4)+k&C#VzJ4br>0wv%Yp zu schreiben. Der Konverter reproduziert das, wenn Von auf IPv6-Adresse und Nach auf RFC 1924 (IPv6 Base85) steht.
Ascii85 in PDF und PostScript
PostScript Level 2 führte Ascii85 ein, um Binärdaten wie Bilder und Schriften in eine Textdatei einzubetten. Die Daten werden als <~ … ~> gerahmt. In PDF enthält ein Stream mit /Filter /ASCII85Decode dieselbe Kodierung, abgeschlossen mit ~>. Der Decoder hier findet die Endmarkierung mit oder ohne das öffnende <~.
Ascii85 ist oft der äußere Filter einer Kette, zum Beispiel /Filter [/ASCII85Decode /FlateDecode]. Das Dekodieren des Ascii85 liefert dann zlib-komprimierte Bytes statt lesbarem Inhalt.
Git verwendet Base85 anders. In einem GIT binary patch beginnt jede Zeile mit einem Längenzeichen (A–Z für 1–26 Bytes, a–z für 27–52), gefolgt vom Base85 der zlib-komprimierten Daten. Entfernen Sie vor dem Dekodieren dieses erste Zeichen aus jeder Zeile und entpacken Sie dann das Ergebnis.
Ascii85 und Base85 in Python
Die Standardbibliothek kennt beide Alphabete:
import base64
base64.a85encode(b"Hello") # b'87cURDZ'
base64.a85encode(b"Hello", adobe=True) # b'<~87cURDZ~>'
base64.a85encode(b" ", foldspaces=True) # b'y'
base64.b85encode(b"Hello") # b'NM&qnZv'
base64.a85decode(b"<~9jqo^~>", adobe=True) # b'Man '
a85decode braucht adobe=True, um die Begrenzer zu akzeptieren. Weitere Rezepte zum Kodieren finden Sie auf der Python-Seite.
Häufige Probleme
"z" an Position … ist nur zwischen 5-Zeichen-Gruppen erlaubt. Einzsteht mitten in einer Gruppe. Die Daten sind beschädigt, oder es ist kein Ascii85; Z85 und Git-Base85 verwendenzals gewöhnliche Ziffer.die Gruppe ab Position … liegt außerhalb des Wertebereichs. Fünf Zeichen kodieren einen Wert über 2^32 − 1. Das passiert, wenn Git-Base85 oder Z85 als Ascii85 dekodiert wird; stellen Sie Von um.- Unerwartetes Zeichen wie
v,{oder|. Alles nachuaußer den Abkürzungenyundzliegt außerhalb des Ascii85-Alphabets, ein weiteres Zeichen für eine andere Variante. - Die Ausgabe hat am Ende zusätzliche Nullbytes. Ihr Encoder hat die letzte Gruppe aufgefüllt und alle 5 Zeichen geschrieben. Ascii85 schreibt für eine letzte Gruppe aus n Bytes n + 1 Zeichen.
Häufige Fragen
Was ist der Unterschied zwischen Base85 und Ascii85?
Base85 ist die allgemeine Idee, 4 Bytes als 5 Zeichen aus einem Satz von 85 Zeichen zu schreiben. Ascii85 ist Adobes Version mit den Zeichen ! bis u, der Abkürzung z und den Begrenzern <~ ~>. Git, Pythons b85encode, Z85 und RFC 1924 rechnen genauso, nur mit anderen Alphabeten.
Was bedeutet z in Ascii85?
Ein einzelnes z steht für vier Nullbytes, die sonst als !!!!! geschrieben würden. Es ist nur dort erlaubt, wo eine vollständige Gruppe aus 5 Zeichen beginnen würde; ein z mitten in einer Gruppe ist ein Fehler.
Wie dekodiere ich Ascii85 aus einem PDF?
Kopieren Sie die Stream-Daten zwischen stream und endstream bis einschließlich ~> und fügen Sie sie mit der Richtung Ascii85 (Adobe) → Text ein. Steht beim Stream zusätzlich /FlateDecode, ist das Ergebnis zlib-Daten; stellen Sie Nach auf Base64 und entpacken Sie es mit dem gzip- und zlib-Decoder.
Ist Base85 besser als Base64?
Es ist etwa 6 % kürzer: 25 % Overhead gegenüber 33 %. Seine Alphabete enthalten aber je nach Variante Anführungszeichen, Backslashes oder < und &, sodass es in JSON, XML oder der Shell maskiert werden muss, wo Base64 das nicht braucht. Setzen Sie es dort ein, wo diese Zeichen unbedenklich sind.