IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Codierungen - Die Base64 - Codierung



Die Base64 - Codierung

In diesem Dokument stelle ich die Base64-Codierung vor, die bei e-Mails recht verbreitet ist, auch wenn die meisten Anwender mit der Codierung nicht in Berührung kommen, da das Mail-Programm die Codierung/Decodierung selbstständig erledigt. Wer jedoch einmal wissen möchte, was "hinter den Kulissen" vor sich geht, kann dies hier erfahren.


Autor: Rolf Viehmann (Rolfhub)
Datum: 02-02-2002, 21:35:21
Referenzen: RFC 2045
Schwierigkeit: Fortgeschrittene
Ansichten: 8604x
Rating: 8.5 (2x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



In diesem Dokument stelle ich die Base64-Codierung vor, die bei e-Mails recht verbreitet ist, auch wenn die meisten Anwender mit der Codierung nicht in Berührung kommen, da das Mail-Programm die Codierung/Decodierung selbstständig erledigt. Wer jedoch einmal wissen möchte, was "hinter den Kulissen" vor sich geht, kann dies hier erfahren.

Die Base64 - codierten Daten sind für Menschen nicht verständlich, die Methode ist jedoch recht simpel.
Ziel der Codierung ist es, eine beliebige Datei (Binärdatei) über einen Übertragungsweg zu bewegen, der normalerweise nicht dazu in der Lage wäre, Binärdaten unverändert zu übertragen. Meines Wissens nach wird die Base64 - Codierung in der Praxis nur in e-Mails benutzt, und zwar wenn an die Mail Dateien "angehängt" werden (z. B. eine .zip - Datei). Nicht jeder Mail-Gateway ist in der Lage, Binärdateien unverändert zu übertragen, und dies ist auch nicht vorgesehen, im entsprechenden FAQ ist festgehalten, dass e-Mails nur die unteren 7 Bit benutzen sollen. Desswegen müssen die Daten kodiert werden, z. B. im Base64 - Format. Leider steigt hierdurch die Datenmenge um 33 Prozent (auf 4/3), warum, dass werden wir noch sehen. Aus diesem Grunde ist es bei größeren Dateien ratsam, die Datei per FTP auf einen Server upzuloaden, und nur die URL zu versenden, falls dies möglich ist. Weiterhin ist es ratsam, die Dateien vor dem Versenden zu packen, und eine .zip/.rar/.ace/... Datei zu versenden, da die Codierung keinerlei Kompression beinhaltet, jedoch wie gesagt beliebige Binärdaten verarbeitet.

Wie funktioniert diese Codierung nun?
Ich beschreibe hier nur, wie die Daten codiert werden, die Decodierung läuft in genau entgegengesetzter Reihenfolge ab, es sollte also jedem möglich sein, sich ein Verfahren zur Decodierung selbst auszudenken.

1. Input: Gruppen von 24 Bit (= 3 Bytes)
2. Output: Pro Gruppe werden 4 Zeichen ausgegeben
Eine Datei wird vom Beginn an eingelesen, immer 3 Bytes auf einmal, womit dann eine Variable gefüllt wird:

Der Input-Datenstrom wird so geordnet, dass das erste Bit zum Bit 7 des ersten Bytes (a) wird, also zum höchstwertigsten Bit.

[1-----]-[2-----]-[3-----] Byte
76543210-76543210-76543210 Bit
aaaaaaaa-bbbbbbbb-cccccccc Input, das a Bit 7 war in der Datei am weitesten vorne
aaaaaabb-bbbbcccc-ccdddddd Output

Ich bekomme also vier Zahlen aus Output, die jeweils Werte zwischen 0 und 63 annehmen können (64 Zustände!), wobei für jede Zahl ein Zeichen in der folgenden Tabelle zugeordnet ist. Ich gebe also vier Zeichen aus, die zusammen 3 Bytes des Inputs definieren. Jedes dieser Zeichen kann in einer e-Mail auftauchen, ohne Probleme zu verursachen, da es alles Standard-ASCII-Zeichen sind.

(Vom Decoder müssen alle Zeichen, die im codierten Datenstrom auftauchen, jedoch nicht in der Tabelle enthalten sind, ignoriert werden.)

WertZeichen
0A
1B
2C
3D
4E
5F
6G
7H
8I
9J
10K
11L
12M
13N
14O
15P
16Q
17R
18S
19T
20U
21V
22W
23X
24Y
25Z
26a
27b
28c
29d
30e
31f
32g
33h
34i
35j
36k
37l
38m
39n
40o
41p
42q
43r
44s
45t
46u
47v
48w
49x
50y
51z
520
531
542
553
564
575
586
597
608
619
62+
63/
[pad]=

Was ist jetzt aber, wenn die Dateilänge der zu codierenden Datei nicht glatt durch 3 teilbar ist? Nun, dafür gibt es das [pad]-Zeichen, es werden mehrere Fälle unterschieden:
1.) Es bleiben zum Schluss genau drei Bytes übrig: in diesem Fall wird kein [pad]-Zeichen benutzt, da daraus genau 4 Zeichen werden.
2.) Es bleibt ein Byte übrig: In dem Falle werden zwei Zeichen ausgegeben, wobei die niedrigsten 4 Bits der Index-Zahl b mit 0 gefüllt werden, anschließend werden zwei [pad]-Zeichen ausgegeben.
3.) Es bleiben zwei Bytes übrig: Es werden drei Zeichen ausgegeben, wobei die niedrigsten 2 Bits vom Index von Zeichen c mit 0 gefüllt werden, es folgt ein [pad]-Zeichen.

Beispiel:

--Message-Boundary-19218
Content-type: Application/ZIP; name="Info.zip"
Content-disposition: attachment; filename="Info.zip"
Content-transfer-encoding: BASE64

UEsDBAoAAgAAAKGhSyvuK51MDAAAAAwAAAAIAAAASW5mby50eHRUZXN0ZGF0ZWkuDQpQSwEC
FAAKAAIAAAChoU sr7iudTAwAAAAMAAAACAAAAAAAAAABACAAgIEAAAAASW5mby50eHRQSwUG
AAAAAAEAAQA2AAAAMgAAAAAA

--Message- Boundary-19218--

Hier sehen wir einen Ausschnitt aus einer e-Mail, mit einer Base64-encodeden Datei. Wer mag, kann ja mal versuchen, ein kleines Programm zu schreiben, dass die Originaldatei (Info.zip) erzeugt. Wenn diese fehlerfrei entpackt werden kann, dann funktioniert das Programm einwandfrei.


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06243
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1144
Comments: 0