Base85
Unter der Bezeichnung Base85 werden verschiedene, zueinander inkompatible Kodierungsverfahren zusammengefasst, die 8-bit-Binärdaten in eine Folge von druckbaren ASCII-Zeichen umwandelt. Sie haben gemeinsam, dass sie Blöcke von jeweils vier Bytes in fünf ASCII-Zeichen kodieren. Hierfür sind mindestens 85 verschiedene Zeichen nötig, was diesem Verfahren seinen Namen gab. Der Vorteil ist der mit 25 % etwas geringere Kodierungsoverhead, im Vergleich zu 33 %, der bei der standardisierten Base64-Kodierung auftritt.
Die größte Verbreitung hat diese Kodierung im PostScript-Dateiformat von Adobe, diese Kodierungsversion wird auch Ascii85 genannt.
Grundidee
Vier Bytes können 2564 = 4.294.967.296 verschiedene mögliche Zustände annehmen. Um diese mit möglichst geringem Overhead zu kodieren, wählt man eine geeignete Teilmenge aus den druckbaren ASCII-Zeichen aus, die es ermöglicht, mit 5 Zeichen auszukommen. Hierfür ist ein Alphabet von mindestens 85 Zeichen nötig, da 855 = 4.437.053.125 ≥ 4.294.967.296 ist. (84 Zeichen reichen nicht, denn 845 = 4.182.119.424 < 4.294.967.296).
Wenn die vier Bytes mit und bezeichnet werden, und die fünf kodierten Zeichen , so ergibt sich folgende Umrechnungsformel:
Mit anderen Worten: Die vier Bytes werden als vierstellige Zahl zur Basis 256 aufgefasst und in eine fünfstellige Zahl zur Basis 85 umgewandelt.
Die Codes werden nun durch bestimmte druckbare ASCII-Zeichen repräsentiert.
PostScript
Die Base85-Kodierung in PostScript addiert auf die Werte den Wert 33 und benutzt somit die ASCII-Werte 33 bis 117, welche den ASCII-Zeichen !
bis u
entsprechen. Einzige Ausnahme dabei: vier aufeinander folgende Nullbytes werden nicht durch !!!!!
kodiert, sondern mit einem einzelnen z
. Durch diese einfache Art der Datenkomprimierung wird der Kodierungsoverhead von Base85 je nach Dateninhalt verringert oder sogar kompensiert, zumal insbesondere bei in PostScript eingebetteten Rastergrafiken längere Folgen von Nullbytes recht häufig vorkommen können.
Bei der Kodierung können nach Belieben Leerzeichen und Zeilenumbrüche eingefügt werden, etwa um eine bestimmte maximale Zeilenlänge zu erreichen. Diese Zeichen werden bei der Dekodierung ignoriert. Alle anderen Zeichen stellen einen Fehler dar, worauf die Dekodierung abbricht.
IPv6-Adressenkodierung nach RFC 1924
Eine etwas andere Kodierung wurde im RFC 1924 für IPv6-Adressen vorgeschlagen (Man beachte den Tag der Veröffentlichung dieses RFCs). Die zu kodierende 128-bit-IPv6-Adresse wird nicht in vier Blöcke zu je 32 Bit zerteilt, sondern als eine 128-Bit-Zahl aufgefasst. Diese wird sukzessive durch 85 geteilt, die dabei auftretenden Reste sind die „Ziffern“ der Base85-Kodierung.
Jede IPv6-Adresse lässt sich so in 20 Zahlen aus dem Bereich 0…84 kodieren. Die Zuordnung dieser Zahlen zu ASCII-Zeichen erfolgt über eine Look-up-Tabelle, da man bei der Kodierung bestimmte ASCII-Zeichen vermeiden wollte, die „in bestimmten Umgebungen problematisch sein könnten“. Die verwendete Look-up-Tabelle ist wie folgt:
Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 17 | H | 34 | Y | 51 | p | 68 | ) | ||||
1 | 1 | 18 | I | 35 | Z | 52 | q | 69 | * | ||||
2 | 2 | 19 | J | 36 | a | 53 | r | 70 | + | ||||
3 | 3 | 20 | K | 37 | b | 54 | s | 71 | - | ||||
4 | 4 | 21 | L | 38 | c | 55 | t | 72 | ; | ||||
5 | 5 | 22 | M | 39 | d | 56 | u | 73 | < | ||||
6 | 6 | 23 | N | 40 | e | 57 | v | 74 | = | ||||
7 | 7 | 24 | O | 41 | f | 58 | w | 75 | > | ||||
8 | 8 | 25 | P | 42 | g | 59 | x | 76 | ? | ||||
9 | 9 | 26 | Q | 43 | h | 60 | y | 77 | @ | ||||
10 | A | 27 | R | 44 | i | 61 | z | 78 | ^ | ||||
11 | B | 28 | S | 45 | j | 62 | ! | 79 | _ | ||||
12 | C | 29 | T | 46 | k | 63 | # | 80 | ` | ||||
13 | D | 30 | U | 47 | l | 64 | $ | 81 | { | ||||
14 | E | 31 | V | 48 | m | 65 | % | 82 | | | ||||
15 | F | 32 | W | 49 | n | 66 | & | 83 | } | ||||
16 | G | 33 | X | 50 | o | 67 | ( | 84 | ~ |
Nicht verwendet werden die ASCII-Zeichen: " ',. /: [ \ ]
sowie das Leerzeichen und die 33 Steuerzeichen.
Z85
Da die Ascii85-Kodierung, die in PostScript und PDF benutzt wird, Zeichen verwendet, die in XML, JSON und String-Literalen vieler Programmiersprachen nicht verwendet werden können, wurde für ZeroMQ ein anderes Kodierungsformat namens Z85 entwickelt.[1] Es verwendet die nebenstehende Kodierungstabelle und kodiert außerdem Binärdaten nur in vollständigen 4-Byte-Blöcken. Falls Binärdaten verarbeitet werden müssen, deren Länge kein ganzzahliges Vielfaches von 4 ist, muss ein anwendungsspezifisches Padding verwendet werden.
Nicht verwendet werden folgende druckbaren ASCII-Zeichen: " ', ; \ _ ` | ~
Es verwendet jedoch auch die Zeichen &
, <
und >
, die in HTML/XML als Tag-Begrenzer und Entitäten-Markierung dienen und somit nicht uneingeschränkt im HTML-/XML-Quelltext verwendbar sind.
Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 17 | h | 34 | y | 51 | P | 68 | ! | ||||
1 | 1 | 18 | i | 35 | z | 52 | Q | 69 | / | ||||
2 | 2 | 19 | j | 36 | A | 53 | R | 70 | * | ||||
3 | 3 | 20 | k | 37 | B | 54 | S | 71 | ? | ||||
4 | 4 | 21 | l | 38 | C | 55 | T | 72 | & | ||||
5 | 5 | 22 | m | 39 | D | 56 | U | 73 | < | ||||
6 | 6 | 23 | n | 40 | E | 57 | V | 74 | > | ||||
7 | 7 | 24 | o | 41 | F | 58 | W | 75 | ( | ||||
8 | 8 | 25 | p | 42 | G | 59 | X | 76 | ) | ||||
9 | 9 | 26 | q | 43 | H | 60 | Y | 77 | [ | ||||
10 | a | 27 | r | 44 | I | 61 | Z | 78 | ] | ||||
11 | b | 28 | s | 45 | J | 62 | . | 79 | { | ||||
12 | c | 29 | t | 46 | K | 63 | - | 80 | } | ||||
13 | d | 30 | u | 47 | L | 64 | : | 81 | @ | ||||
14 | e | 31 | v | 48 | M | 65 | + | 82 | % | ||||
15 | f | 32 | w | 49 | N | 66 | = | 83 | $ | ||||
16 | g | 33 | x | 50 | O | 67 | ^ | 84 | # |
Sonstige Verwendung
Trotz des etwas geringeren Overheads hat sich die Base85-Kodierung – außer in Spezialgebieten – nicht durchsetzen können. Mittlerweile existiert mit Base91[2] ein noch effizienteres Verfahren. Für die ASCII-Kodierung von Binärdaten in E-Mails und Usenet-Artikeln ist nur die Base64-Kodierung nach dem MIME-Standard vorgesehen.