Das Base64-Format Datei B64_D.TXT JB ----------------------------------------------------------------------- Das Base64-Format ##################################################### UUEncode (sprich Ju-Ju-Encode) ist ein Verfahren, um 8-Bit-Daten so umzusetzen, dass das Ergebnis nur Zeichen aus dem Bereich "A"..."Z", "a"..."z", "0"..."9", "+" und "/" enthaelt. Dies erfolgt in fuenf Schritten: 1.: Einlesen der Datei in Pascal-Strings der maximalen Laenge 54 (Alle bis auf den letzten String sind 54 lang, der letzte ist meist kuerzer als 54). Der Encoder merkt sich die Laenge des jeweils eingelesenen Pascal-Strings. 2.: Umwandeln der 8-Bit-Daten der einzelnen Strings in 6-Bit-Daten. Dazu werden die Strings in Gruppen vom je 3 Bytes aufgeteilt. Diese 3 Bytes werden dann zu jeweils 4 Bytes konvertiert. Beispiel: aus 11110001 11110001 11110001 (hex. F1 F1 F1) | | \ | \ | \ \ | | \ | \ | \ \ wird 111100 011111 000111 110001 | | | | | | | | und dann 00111100 00011111 00000111 00110001 (hex. 3C 1F 07 31) Da alle Strings die Laenge 45 haben, bereitet die Aufteilung in 3-Byte-Gruppen keine Probleme. Eine Ausnahme bildet der letzte String. Dieser ist meist kuerzer als 45 und nicht durch 3 teilbar. Die letzte Gruppe besteht dann nur aus 2 oder 1 Byte. Diese werden konvertiert zu 3 bzw. 2 Bytes. Beispiel fuer 2-Byte-Restgruppe: aus 11110001 11110001 (hex. F1 F1) | | \ | \ \ | | \ | \ \ wird 111100 011111 000100 | | | | | | und dann 00111100 00011111 00000100 (hex. 3C 1F 04) Beispiel fuer 1-Byte-Restgruppe: aus 11110001 (hex. F1) | | \\ | | \\ wird 111100 010000 | | | | und dann 00111100 00010000 (hex. 3C 10) 3.: Die einzelnen Bytes der Ergebnis-Strings liegen jetzt im Bereich 0 bis 63 (00000000 bis 00111111). Die Abbildung auf die oben genannten Ziel-Werte erfolgt anhand einer Tabelle: +----------------+-------------+--------------------+ | Byte (dezimal) | Ziel-Wert | Ziel-Wert(dezimal) | +----------------+-------------+--------------------+ | 0 ... 25 | "A" ... "Z" | 65 ... 90 | | 26 ... 51 | "a" ... "z" | 97 ... 122 | | 52 ... 61 | "0" ... "9" | 48 ... 57 | | 62 | "+" | 43 | | 63 | "/" | 47 | +----------------+-------------+--------------------+ Jedes Byte des Ergebnis-Strings wird anhand dieser Tabelle konvertiert. 4.: Die so modifizierten Ergebnis-Strings haben normalerweise eine Laenge von 72 Bytes (54*4/3). Sind sie jedoch kuerzer (letzter String), dann muss gewaehrleistet werden, dass die Laenge durch 4 teilbar ist, damit der String spaeter vom Decodierer in Bloecke zu je 4 Bytes aufgeteilt werden kann. Dies geschieht durch Auffuellen mit 1 oder 2 Gleichheitszeichen (Ascii-Nr. 61). Beispiel: Der String "Hello" ergibt nach der Konvertierung den Ergebnis-String "SGVsbG8". Dieser wird mit Gleichheitszeichen zu "SGVsbG8=" aufgefuellt. 5.: Die so modifizierten Ergebnis-Strings werden zeilenweise (getrennt durch Ascii_13 und Ascii_10) ausgegeben. Damit der Decoder in einer E-Mail den Beginn und das Ende eines Base64-Blocks erkennt, wird dieser im Rahmen des MIME-Formats benutzt. Das MIME-Format ####################################################### Das MIME-Format dient dazu, mehrere Elemente (Texte und Anlagen) in einem einzigen Dokument zusammenzufassen, das dann z.B. als E-Mail versandt werden soll. Rekursivitaet ######################################################### Das MIME-Format ist rekursiv (schachtelbar). Das heisst, ein Element einer MIME-Datei (z.B. eine Anlage) kann wiederum aus mehreren Elementen bestehen, die ihrerseits per MIME- Format zusammengefasst sind. Dies wird z.B. dann angewendet, wenn einer E-Mail eine Apple-Macintosh-Datei als Anlage beigefuegt werden soll. Mac-Dateien bestehen naemlich zumeist aus zwei Teilen: der Data Fork und der Resource Fork. Bestandteile ########################################################## Eine MIME-Datei besteht aus dem Header und mindestens einem Element. Die Elemente koennen Texte, aber auch Binaer-Dateien wie z.B. Grafiken, WORD-Dokumente oder Programme sein. Jedes Element beginnt mit mindestens einer Beschreibungs-Zeile, in der mitgeteilt wird, um was fuer ein Element es sich handelt. Danach folgt eine Leerzeile und dann der eigentliche Inhalt des Elements. Dieser wird entweder direkt in das MIME-File hineinkopiert, oder vorher Base64-codiert. Beispiel: Der Text "Hello" ergibt folgendes Element: ---------------------------------------------------- Content-Type: text/plain; charset="us-ascii" Hello ---------------------------------------------------- Beispiel: Eine Datei "H.TXT" mit dem Inhalt "Hello", die Base64-codiert ist, ergibt folgendes Element: ------------------------------------------------------- Content-Type: application/octet-stream; name="H.TXT" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="H.TXT" SGVsbG8= ------------------------------------------------------- Boundary ############################################################## Damit der Decoder erkennen kann, wo das naechste Element beginnt, endet jedes Element (und auch der Header) mit einer Boundary-Zeile. Dies ist eine ganz bestimmte Zeichenfolge. Sie besteht aus zwei Strichen ("--"), gefolgt von einem String, der innerhalb des Headers mit dem Befehl Boundary="xxx" definiert wird. Am Ende des MIME-Dokuments werden an den Boundary-String noch zwei Striche ("--") angehaengt. Den Boundary-String kann der Encoder beliebig waehlen. Wichtig ist nur, dass die sich daraus ergebende Boundary-Zeile in keinem Element der MIME-Datei vorkommen darf. Komplett-Beispiel ##################################################### Es folgt eine E-Mail mit dem Inhalt "This is the text", an die zwei Dateien angehaengt sind: Die Text-Datei "ATT.TXT" mit dem Inhalt "This is an attachment" und die Datei "H.DAT" mit dem Inhalt "Hello". ATT.TXT wird als Text angehaengt, H.DAT dagegen im Base64-Format. (Die Zeilen "Beginn" und "Ende" gehoeren nicht zum MIME-File). Beginn------------------------------------------- Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="TheLine" --TheLine Content-Type: text/plain; charset="us-ascii" This is the text --TheLine Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="ATT.TXT" This is an attachment --TheLine Content-Type: application/octet-stream; name="H.DAT" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="H.DAT" SGVsbG8= --TheLine-- Ende------------------------------------------- Netscape Bug ########################################################## Das E-Mail-System des Netscape-Browsers benutzt das MIME-Format, und es ist anzunehmen, dass es sich mehr und mehr in allen Mail-Systemen durchsetzen wird. Leider hat der Netscape-Navigator (zumindest auf meinem PC) einen Programmierfehler, der dazu fuehrt, dass bei ange- haengten Binaer-Dateien teilweise das letzte Byte genullt wird. Dies geschieht genau dann, wenn die Laenge dieser Datei nicht durch 3 teilbar ist, sondern einen Rest von 1 ergibt. Diese Datei ########################################################### HTTP://WWW.SERVE.COM/JB/B64_D.TXT wurde erstellt von Joerg Buchwitz im September 1996. Letzte Aenderung: 09/96. Die Datei ist verfuegbar auf JBs HomePage http://www.serve.com/jb