Base64 En/Decode

Base64 ist ein Verfahren, um Daten mit insgesamt nur 64 ASCII-Zeichen darstellen zu können. Die codierten Daten können von jedem System gelesen und zurückkonvertiert werden.

Vorteile

  • Lesbar von jedem System
  • Codepage unabhängige Zeichen
  • Nicht alle Protokolle können erlauben eine 8bit Kodierung.
    Nach Base64 sind die Daten 6bit kodiert.
  • Der neue Bytestream besteht nur aus den 64 ASCII-Zeichen.
    Versehentliche Protokoll Befehle können somit vorgebeugt werden.

Nachteile

  • Kodierung nicht lesbar
  • ca 33 – 36% erhöhter Platzbedarf

Die Kodierung besteht darin, 3 Bytes in 4 x 6 Bits zu speichern.
Jedes dieser 6 Bit Felder kann anschließend eindeutig einem ASCII-Zeichen zugeordnet werden.
Achtung. Besteht der Quellstream aus einer Länge die nicht durch 3 geteilt werden kann, müssen entsprechende Bytes hinzugefügt werden.

Hier noch die Grafische Untermalung.

Base64
http://upload.wikimedia.org/wikipedia/de/7/7e/Base64.png

Encoding

Kommen wir nun zur Umsetzung des En/Decoders. Der Folgende Code wurde mit Java realisiert.

Ist der “inputBuffer” (der Bytestream) nicht durch drei teilbar, so müssen fillerBytes erstellt werden.
Diese Bytes werden mit dem Zeichen “=” befüllt.

Die Methode “createFillerBytes” ist wiefolgt definiert: (PADDING_CHAR = “=” )

TotalBytes ist nun ein Array mit der Länge des inputStreams und unseren FillerBytes.
Wir kopieren die bereits erhalten Daten in das neue Array und arbeiten ab sofort mit “totalBytes” weiter.

Um das auslesen der einzelnen Bits zu erleichtern, speichern wir die nächsten 3 Bytes in einen Integer. (Iterration über das Array mit i += 3)

Nun können die 4 x 6 Bits bequem aus dem Integer ausgelesen und auf einen Stream geschrieben werden. “byteToTableChar” übersetzt die jeweilige Bitkombination in ein Base 64 ASCII Zeichen.

Eine Tabelle ist hier zu finden.

Zuletzt müssen noch die Fillerbytes auf den Stream geschrieben werden.

Decoding

Die folgende Methode ist sicherlich nicht die effektivste und schönste Realisierung.
Wie würdet Ihr das Decoding realisieren? Lasst es mich wissen.

In den folgenden Stream werden wir das Ergebnis schreiben.
(Input von “inputString)

Dieses mal iterrieren wir nicht mit i+=3, sondern mit i+=4, da die 4 ASCII Zeichen den 4 x 6 Bits entsprechen. Wir schreiben, gleich wie beim Encoding, die Bytes wieder in einen Integer.
Achtung. Es muss natürlich auf die Padding_Chars geachtet werden. Das 3 oder 4 Zeichen könnte bereits das ASCII-Zeichen “=” sein.

Nun befinden sich die (im Idealfall) 4 x 6 Bits, in dem Integer. Die insgesamt 24 Bit können nun wieder in 3 Bytes geladen werden. Oder einfach direkt in den Stream. Sollte das aktuelle Zeichen dem Padding Char entsprechen, überspringe das Byte.

Eine Base64 alternative wäre quoted printable, bei dem nach dem Kodieren das Resultat noch zum Großteil gelesen werden kann.

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.