ASCII85 Code
Kategorisierung: | Kodierungen / binärbasiert |
Siehe auch: | UUEncode, Base32, Base64, Base85, ASCII85 |
Herkunft / Verwendung: | Base85 ist ähnlich Base64 ein weiteres Verfahren zur Abbildung von 8-bit-Binärdaten auf lesbare ASCII-Zeichen. Hier werden allerdings 85 Zeichen benutzt. So ist der Overhead nur 25% statt 33% bei Base64. Es werden jeweils 4 Bytes der Binärdaten auf 5 Bytes Base85-Code abgebildet. Der codierte Text wird so ein viertel größer als die Binärdaten. |
Beschreibung des Algorithmus
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.Für die Kodierung werden die vier Bytes als vierstellige Zahl zur Basis 256 aufgefasst und in eine fünfstellige Zahl zur Basis 85 umgewandelt. Das heißt, jede Ziffer der Basis85-Zahl kann einen Wert von 0 bis 84 annehmen. Da die druckbaren ASCII-Zeichen bei 33 beginnen, wird einfach ein Wert von 33 addiert und das ASCII-Zeichen mit dem errechneten Wert benutzt, also in einem Bereich von 33 (!) bis 117 (u).
Dem kleinen 'z', dass nicht mehr in diesem Bereich liegt, kommt eine Sonderrolle zu: es symbolisiert vier aufeinanderfolgende Nullbytes im Original die zu '!!!!!' übersetzt würden. So spart man bei Datenformaten, bei denen viele Nullbytes vorkommen etliche Ausrufezeichen und damit Platz ein.
Leerzeichen (ASCII 32) und Zeilenumbrücke (ASCII 13 und 10) sind nicht im ASCII-85-Code vorhanden, können also bei einer Dekodierung ausgeklammert werden, so dann ASCII-85-Code mithilfe dieser Zeichen formatiert werden können (etwa Zeilenumbruch an Position 80). Häufig erhält ASCII-Code zu Beginn ein <~ und am Ende ein ~>, um es als solchen kenntlich zu machen.
Beispiel
Binärfolge: | C001C0DE (Hexcode) |
Kodiert: | ^]D7- |
c0 01 c0 de <-- hexadezimal (Basis 16)
11000000 00000001 11000000 11011110 <-- binär (Basis 2)
3221340382 <-- dezimal (Basis 10)
(61) (60) (35) (22) (12) <-- Basis 85 (Ziffernwertigkeit dez.)
94 93 68 55 45 <-- +33 = ASCII-Code
^ ] D 7 - <-- ASCII-Zeichen