Das perfekte Versprechen

Volkers Editorial

01.06.2002 Manchmal kommen Dateien bei der Übertragung am anderen Ende anders an, als sie ursprünglich verschickt wurden. Das hat viele Ursachen – oft historisch gewachsene, unterschiedliche Konventionen verschiedener Systeme. So ist ein häufiger Fehler die falsche Übertragung von Textdateien mit FTP.

Sicher sehr bekannt ist das Werkzeug ftp. Weniger bekannt sind die sechs spezifizierten Übertragungsarten, die FTP unterstützt – nur zwei davon sind brauchbar: ASCII und binär. Wenn nun z. B. eine Textdatei im binären Modus von einem Unix- auf ein Windows-System übertragen wird, erscheinen die einzelnen Ursprungszeilen wie aneinandergehängt. Das liegt an den unterschiedlichen Konventionen des Zeilenumbruchs auf den beiden Systemen. Im ASCII-Modus wäre die Datei für die Zielmaschine durch das FTP-Programm passend konvertiert worden. Wird umgekehrt eine binäre Datei, z. B. ein Programm oder eine Bilddatei, nicht im binären Modus übertragen, glaubt das Übertragungsprogramm, einen Text vor sich zu haben, und konvertiert ihn munter in einen Haufen Müll; jedenfalls ist das Endergebnis als binäre Datei nicht mehr verwendbar.

Um den FTP-Client anzuweisen, binäre oder ASCII-Übertragung zu verwenden, werden die Befehle binary und ascii verwendet, die auch abgekürzt werden dürfen (bin und asc):

ftp> binary
200 Type set to I.
ftp> ascii
200 Type set to A.

Dies ist nur ein Beispiel dafür, wie eine Datei bei der Übertragung zerstört werden kann. Ein weiteres ist die Benutzung von Steuersignalen, die viele Programme früher verwendeten. So wurden verschiedene Bytes mit besonders kleinen oder besonders hohen numerischen Werten (kleiner als 0x20 oder größer als 0x80) zur Steuerung übertragen. Ergebnis: Man kann sich heute nicht darauf verlassen, dass alle Rechner, die zwischen einem Quell- und Zielrechner liegen, alle Bytes unverstümmelt durchlassen. Eine der ersten Lösungen für dieses Problem waren die Unix-Kommandos uuencode und uudecode. (Der Name der Kommandos sollte klar machen, dass uuencode für die Vorbereitung einer binären Datei zur Übersendung dient und uudecode diese wieder rückgängig machen kann.)

Bit-Schnitzer

Das Programm uuencode verwandelt eine binäre Datei so, dass sie nur druckbare Zeichen enthält. So kann die entstandene Datei auch mit simplen Mail-Programmen wie mail verschickt werden. Dafür werden die Bits in der Ursprungsdatei ein wenig verschoben und umformatiert. Außerdem werden noch ein Dateiname und die Berechtigungsmodi mit ausgegeben, damit beim Wiederherstellen das Programm uudecode weiß, wie die Datei heißt und welche Berechtigungen sie haben soll. Das Ganze wird noch in einen "begin-end"-Block gepackt und in die Ergebnisdatei geschrieben. Eine typische mit uuencode behandelte Datei hat das folgende Aussehen:

begin 644 bild.jpg
M`P($`P4%!`0```%]`0(#``01!1(A,4$&$U%A!R)Q%#*!D:$((T*QP152T?`D
M,V)R@@D*%A<8&1HE)BAH*2HT-38W.#DZ0T1%1D=(24I35%565UA96F-D969G
…
end

Was beim uu-Kodieren mit den Bits selbst passiert, ist leicht beschrieben: Das Kommando uuencode liest je drei Bytes (also 24 Bits) der Binärdatei ein und splittet diese in vier Päckchen zu je sechs Bits auf. Diesen vier Päckchen wird dann noch 0x20 (dezimal: 32) hinzugefügt und dann jedes als eigenes Byte (führende Bits mit 0 aufgefüllt) ausgegeben. Dieser Algorithmus stellt sicher, dass sich die Ausgabe-Bytes im Bereich von 0x20 bis 0x5f (0x5f = 0x3f + 0x20 bei sechs gesetzten Bits im Päckchen) bewegen.

Abbildung 1: Dieses Schema beschreibt den uuencode-Algorithmus

Es ist daher nicht verwunderlich, dass die Größe einer mit uuencode behandelten Datei um 36% bis 37% wächst. Kasten 1 zeigt, wie ein C-Programm an diese Aufgabe heranginge.

Kasten 1:

uuencode

-Bit-Schnitzen mit C

Zielbyte1 = 0x20 + ((A >> 2) & 0x3f)
Zielbyte2 = 0x20 + (((A << 4 ) | ((B >> 4) & 0x0f)) & 0x3f
Zielbyte3 = 0x20 + (((B << 2 ) | ((C >> 6) & 0x03)) & 0x3f
Zielbyte4 = 0x20 + (C & 0x3f)

Tabelle 1: eine 6 Byte große Datei

Ursprungs-Bytes
0000 0001 0000 0010 0000 0011   0000 0100 0000 0101 0000 0110
Päckchen
000000 010000 001000 000011 000001 000000 010100 110000
Päckchen + 0x20 = Ausgabe-Bytes
00100000 00110000 00101000 00100011 00100001 00100000 00110100 00100110

Tabelle 1 zeigt die uuencode-Verarbeitung einer 6 Byte großen Datei, deren Bytes den ASCII-Codes 1 bis 6 entsprechen. In der Praxis sieht das so aus:

$ uuencode 123456.txt 123456.txt
begin 644 123456.txt
&`0(#!`4&
`
end

Bei der Benutzung von uuencode ist der zweite Parameter der Text, der in das Endergebnis hinter die Angabe der Modi geschrieben wird; er dient beim späteren Dekodieren als Dateiname.

Der Stand der Dinge

Nun ist uuencode nicht die einzige Möglichkeit, binäre Dateien über das Internet durch "Nur-Text-Kanäle" zu verschicken. Die drei wichtigsten Möglichkeiten beherrscht heute bereits standardmäßig der Netscape Messenger (aber auch viele andere Mailprogramme); so braucht sich der mausklickende Anwender eigentlich keine große Gedanken mehr darüber zu machen, was denn nun wie verschickt wird. Dass uuencode auch heute noch nützlich ist, sehen wir später. Die drei wichtigsten Varianten sind BinHex, MIME (auch Base64 genannt) und das bereits besprochene uuencode.

BinHex

Das BinHex-Verfahren hat seinen Ursprung in der Macintosh-Welt. Wir gehen hier nicht weiter darauf ein; Abbildung 2 zeigt, wie eine so verpackte Datei von Netscape angezeigt wird.

Abbildung 2: Darstellung eines mit BinHex bearbeiteten Attachments im Netscpae Messenger

MIME

Dies ist das Standardverfahren beim Netscape Messenger und hat uuencode nur deshalb abgelöst, weil uuencode Probleme bei Mail-Programmen gezeigt hat, die nicht auf ASCII, sondern z. B. auf dem Großrechnerzeichensatz EBCDIC, basieren. Außerdem konnte uuencode scheinbar niemals standardisiert werden, und deshalb wurde MIMEentwickelt. MIME wird häufig auch als Base64 bezeichnet und taucht auch unter diesem Namen im Netscape Messenger auf.

Abbildung 3: Darstellung eines mit MIME bearbeiteten Attachments im Netscpae Messenger

Abbildung 4: So erscheint ein mit uuencode bearbeitetes Attachment im Netscape Messenger

Schnee von gestern?

Mit dem Wachsen des Internets und seinen Möglichkeiten wuchsen auch die Gefahren des ungewollten Zugriffs von außen auf das eigene System. Firewalls sind heutzutage ein Mittel, sich vor der kriminellen Energie von außen zu schützen. Viele Firmen haben noch zusätzliche Maßnahmen ergriffen, um die eigenen Systeme vor Viren oder anderen unliebsamen Überraschungen von außen zu schützen: Bei allen eingehenden Mails werden die Anhänge gnadenlos abgeschnitten und vernichtet.

Lediglich reine Text-Mails kommen etwa an meinem Arbeitsplatz unbeschadet an. Doch wie lässt sich eine benötigte JPEG-Datei dennoch auf den Desktop meines Rechners zaubern? Hier greife ich zum Schnee von gestern: uuencode ist das Mittel der Wahl. Zuerst wandele ich das Bild mit uuencode in einen Text. Diesen schicke ich mir dann an meinen Arbeitsplatz, und dort wandele ich den Text wieder zurück in eine JPEG-Datei. Da ich an meinem Arbeitsplatz einen ganzen AIX-Cluster zur Verfügung habe, steht mir das passende uudecode zur Rückwandlung der Text-Mail in eine binäre Datei natürlich zur Verfügung. Die Befehle zum Verschicken sind:

uuencode robin1.jpg robin1.jpg > robin.uue
mail volker@provider.de < robin.uue

uuencode goes WinZip

Aber was machen all die anderen armen Teufel, die von ihrem Arbeitgeber nur eine Windows-Schachtel auf den Schreibtisch gestellt bekommen haben? Glück gehabt! Denn WinZip kennt das uuencode-Format. Und schon ist das Bild wieder hergestellt. Dabei ist uuencode wieder die richtige Wahl, denn auch wenn die aktuelle WinZip-Version bereits MIME versteht, kommen ältere WinZip-Installationen nur mit uuencode klar. Dafür muss nur die verschickte Mail die Endung "uue" auf der Windows-Kiste erhalten, denn sonst will WinZip die Datei einfach nicht verarbeiten. (Ich habe es vergeblich mit anderen Endungen versucht.) Einmal in WinZip eingeladen, wird mit einem einfachen Klick auf den [Extract]-Knopf die Ursprungsdatei wieder hergestellt. Fertig!

Abbildung 5: Robins Bild mit WinZip auspacken

Glossar

FTP

Das File Transfer Protocol dient der Übertragung von Dateien. Im Jahre 1971 entschieden die Macher des Internets sich für eine Reihe von Regeln für das Kopieren von Dateien von einer Maschine zu einer anderen. Diese Regeln und Konventionen haben den Namen FTP als Abkürzung für "File Transfer Protocol" bekommen, worauf viele Programmierer Anwendungen in die Welt setzten, die sich daran hielten. All diese Programme wurden von ihren Autoren ftp genannt.

druckbare Zeichen

Die Definition druckbarer Zeichen erscheint einfach: Es sind die Zeichen, die ausgedruckt oder grafisch angezeigt werden können. Nur muss man diese Definition im Kontext der 70er Jahre sehen, in denen Drucker noch nicht in der Lage waren, griechische Buchstaben oder irgendwelche sonstigen Sonderzeichen auszugeben. Man kann bei druckbaren Zeichen also in der Regel von lateinischen Buchstaben, Leerzeichen, Ziffern und noch einer kleinen Menge von Satz- und Sonderzeichen ausgehen.

EBCDIC

Akronym für "Extended Binary Coded Decimal Interchange Code", also "erweiterter binärer dezimaler Austausch-Code". Dieser Zeichensatz wird heute hauptsächlich auf IBM-Mainframes und der BS2000 verwendet und ist ein echter 8-Bit-Code, der im Gegensatz zu ASCII 256 verschiedene Zeichen spezifiziert. Leider existiert keine hundertprozentige Übersetzung von EBCDIC nach ASCII und umgekehrt, da es in jedem Zeichensatz Symbole gibt, die nicht im jeweils anderen vorhanden sind.

MIME

Multipurpose Internet Mail Extensions

Der Autor

Volker Schmitt ist Mathematiker, frischgebackener Vater von Robin Folker und arbeitet bei einer großen Versicherung, wo er auch mit Unix, einem AIX-Cluster und einem IBM-Großrechner mit dem Betriebssystem OS/390 (EBCDIC) arbeitet.

Einem Freund empfehlen    Druckansicht beenden Bookmark and Share
Kommentare