Bei Email Anhängen findet man hin und wieder eine merkwürdige Darstellung, die aus den Zeichen A..Z, a..z, 0..9 und den Zeichen '+' und '/' besteht. Am Ende können auch ein oder zwei Gleichheitszeichen stehen.
Dieser beschränkte Zeichensatz hat den Vorteil, dass er unabhängig von sprachspezifischen Zeichen (Umlaute, etc) ist. Damit kodierte Daten können weltweit ausgetauscht werden und sind unabhängig von der Plattform.
Das Prinzip der Kodierung ist relativ einfach: Eine Nachricht, die im 8-Bit-Ascii-Code vorliegt, wird in einen fortlaufenden binären String umgewandelt. Da für die Base64-Kodierung 6 Bit für ein Zeichen genügen, zerhackt man diesen Binärstring in 6-Bit-Blöcke, die entsprechend einer definierten Tabelle in Zeichen umgewandelt werden.

Quelle:http://de.wikipedia.org/wiki/Bild:Base64.png
Das Verfahren geht gut, wenn die Textlänge ein Vielfaches von 3 ist. Dann ergeben jeweils drei Zeichen 24 Bit, die in vier 6-er Blöcke zerlegt werden können. Der Umfang eines Textes wächst also um den Faktor 4/3.
Andernfalls füllt man das Ende der binären Darstellung mit Nullen auf, bis die Textlänge ein Vielfaches von 3 ist.Entstehen dabei am Ende 6-er Blöcke, die nur aus Nullen bestehen, so werden diese durch das Gleichheitszeichen kodiert. Dieses Füllzeichen kann dann bei der Dekodierung wieder herausgefiltert werden.
Mit Haskell kann das Verfahren schrittweise implementiert werden. Die Kodierung setzt sich dabei aus der Komposition (Verkettung) vieler einzelner, einfacher Funktionen zusammen. Die Entwicklung entspricht dem Top-Down-Verfahren, bei dem die einzelnnen Schritte immermehr verfeinert werden. Die einzelnen Funktionen sind meist einfach und können ausgiebig getestet werden.
Außerdem bietet diese Zerlegung eines 'großen' Problems in kleinere Einheiten die Möglichkeit, das Programm in Gruppenarbeit zu realisieren.
Vorgehensweise beim Kodieren:
-- Hauptfunktion zum Kodieren eines Textes nach Base64
toBase64 :: String -> String
1. Schritt: Umwandlung der Nachricht in einen Binärstring. Dabei müssen alle Ascii-Zeichen durch 8-Bit binär dargestellt werden. Gegebenenfalls müssen führende Nullen eingefügt werden.
-- Umwandeln in Binärstring
toBinString :: String -> String
2. Schritt: Erweitern des binären Strings durch Anhängen von Nullen auf eine Länge, die ein Vielfaches von 24 ist.
-- Erweitern eines Strings auf eine Länge (Vielfaches von 24)
erweitern :: String -> String
3. Schritt: Aufteilen des Binärstrings in Blöcke der Länge n=6
-- Aufteilen eines Strings in Blöcke der Länge n
splitList :: Int -> String -> [String]
4. Schritt: Umwandeln der einzelnen Blöcke in die kodierten Zeichen. Hier bietet es sich an, eine Funktion zu schreiben, die ein Zeichen (6-Bit-String) in das entsprechende kodierte Zeichen umwandelt. Diese Funktion kann dann auf alle 6-er Blöcke angewandt werden.
-- Umwandlung eines 6-Bit-Strings in ein (Ascii-)Zeichen
-- gemäß Base64-Kodierung
toCharBase64 :: String -> Char

5. Schritt: Anfügen einer Endkorrektur (falls nötig). Hierfür wird die Länge des Originaltextes benötigt.
-- Erweitern eines Strings durch Anhängen von Nullen
-- bis die Länge ein Vielfaches von 24 ist.
-- Hierfür wird die Länge des Originaltextes benötigt
endkorrektur :: Int -> String -> String
Damit kann die Kodierfunktion erstellt werden. Zu beachten ist dabei, dass die Reihenfolge von unten nach oben ausgeführt wird. Dies entspricht der mathematischen Verkettung von rechts nach links.
-- Hauptfunktion zum Kodieren eines Textes nach Base64
toBase64 :: String -> String
toBase64 xs = ( (endkorrektur (length xs))
. (map toCharBase64)
. (splitList 6)
. erweitern
. toBinString) xs
fromBase64 ( toBase64 "Hello World !")