Sunday 4 June 2017

Multipart Content Transfer Encoding Binary Options

5. Das Content-Transfer-Encoding-Header-Feld 5. Das Content-Transfer-Encoding-Headerfeld Viele Content-Typen, die sinnvoll per Email transportiert werden können, werden in ihrem natürlichen Format als 8-Bit-Zeichen oder Binärdaten dargestellt. Solche Daten können nicht über einige Transportprotokolle übertragen werden. Beispielsweise beschränkt RFC 821 Mail-Nachrichten auf 7-Bit-US-ASCII-Daten mit Zeilen, die nicht länger als 1000 Zeichen sind. Es ist daher notwendig, einen Standardmechanismus zum Umkodieren solcher Daten in ein 7-Bit-Kurzzeilenformat zu definieren. Dieses Dokument legt fest, dass diese Codierungen durch ein neues Content-Transfer-Encoding-Header-Feld angezeigt werden. Das Feld Content-Transfer-Encoding wird verwendet, um die Art der Transformation anzuzeigen, die verwendet wurde, um den Körper in einer akzeptablen Weise für den Transport darzustellen. Im Gegensatz zu Content-Typen ist eine Verbreitung von Content-Transfer-Encoding-Werten unerwünscht und unnötig. Allerdings ist es nicht möglich, nur einen einzigen Content-Transfer-Encoding-Mechanismus einzurichten. Es besteht ein Kompromiss zwischen dem Wunsch nach einer kompakten und effizienten Codierung von weitgehend binären Daten und dem Wunsch nach einer lesbaren Codierung von Daten, die meist, aber nicht vollständig, 7-Bit-Daten sind. Aus diesem Grund sind mindestens zwei Codierungsmechanismen notwendig: eine lesbare Codierung und eine dichte Codierung. Das Feld Content-Transfer-Encoding ist so konzipiert, dass es eine invertierbare Abbildung zwischen der nativen Repräsentation eines Datentyps und einer Repräsentation angeben kann, die unter Verwendung von 7-Bit-Mail-Transportprotokollen, wie den von RFC 821 (SMTP) definierten, leicht ausgetauscht werden kann. Dieses Feld wurde nicht durch einen früheren Standard definiert. Der Feldwert ist ein einzelnes Token, das die Art der Codierung spezifiziert, wie unten aufgelistet. Formal: Bei diesen Werten wird nicht zwischen Groß - und Kleinschreibung unterschieden. Das heißt, Base64 und BASE64 und bAsE64 sind alle äquivalent. Eine Kodierung von 7BIT erfordert, dass der Körper bereits in einer Sieben-Bit-Mail-Ready-Darstellung ist. Dies ist der Standardwert, dh Content-Transfer-Encoding: 7BIT wird angenommen, wenn das Header-Feld Content-Transfer-Encoding nicht vorhanden ist. Die Werte 8bit, 7bit und binary all bedeuten, dass NO-Codierung durchgeführt wurde. Sie sind jedoch potentiell nützlich als Hinweise auf die Art der Daten, die in dem Objekt enthalten sind, und daher auf die Art der Codierung, die für die Übertragung in einem gegebenen Transportsystem erforderlich sein muss. Insbesondere gilt: Der Unterschied zwischen 8bit (oder einem beliebigen anderen denkbaren Bitbreiten-Token) und dem binären Token besteht darin, dass binär keine Einhaltung beliebiger Grenzen der Zeilenlänge oder der SMTP-CRLF-Semantik erforderlich ist, während die Bitbreiten-Token dies erfordern Haftung. Wenn der Körper Daten in einer anderen Bit-Breite als 7-Bit enthält, muss das geeignete Bit-Breite-Content-Transfer-Encoding-Token verwendet werden (z. B. 8bit für nichtcodierte 8 Bit breite Daten). Wenn der Körper binäre Daten enthält, muss das binäre Content-Transfer-Encoding-Token verwendet werden. Implementoren können ggf. neue Content-Transfer-Encoding-Werte definieren, müssen jedoch ein x-Token verwenden, bei dem es sich um einen durch X vorangestellten Namen handelt, um dessen Nicht-Standardstatus anzugeben, z. B. Content-Transfer-Codierung: x-my-new-encoding. Im Gegensatz zu den Content-Typen und Subtypen ist die Erstellung neuer Werte für die Content-Transfer-Codierung jedoch explizit und stark entmutigt, da sie wahrscheinlich die Interoperabilität mit wenig potenziellen Vorteilen behindern. Ihre Verwendung ist nur als Ergebnis einer Vereinbarung zwischen kooperierenden Verwenderagenten erlaubt. Wenn ein Header-Feld Content-Transfer-Encoding als Teil eines Nachrichten-Headers erscheint, gilt es für den gesamten Text dieser Nachricht. Wenn ein Content-Transfer-Encoding-Header-Feld als Teil eines Body-Parts-Headers erscheint, gilt es nur für den Körper dieses Körperteils. Wenn eine Entität vom Typ multipart oder message ist, ist es der Content-Transfer-Codierung nicht gestattet, einen anderen Wert als eine Bitbreite (z. B. 7bit, 8bit usw.) oder binär zu haben. Es sei darauf hingewiesen, dass E-Mail zeichenorientiert ist, so dass die hier beschriebenen Mechanismen Mechanismen zum Codieren von beliebigen Oktettströmen und nicht Bitströmen sind. Wenn ein Bitstrom über einen dieser Mechanismen codiert werden soll, muss er zuerst unter Verwendung der Netzwerk-Standard-Bitreihenfolge (big-endian) in einen 8-Bit-Byte-Strom umgewandelt werden, wobei die älteren Bits in einem Strom die höherwertigen Bits werden, Bits in einem Byte. Ein Bitstrom, der nicht an einer 8-Bit-Grenze endet, muss mit Nullen aufgefüllt werden. Dieses Dokument bietet einen Mechanismus, um die Hinzufügung einer solchen Polsterung im Falle der Anwendung Content-Type, die einen Polsterungsparameter aufweist, zu notieren. Die hier definierten Codierungsmechanismen codieren explizit alle Daten in ASCII. So wird beispielsweise angenommen, dass eine Entität Header-Felder aufweist, wie zB: Dies muss interpretiert werden, um zu bedeuten, dass der Körper eine base64 ASCII-Codierung von Daten ist, die ursprünglich in ISO-8859-1 war, und wird nach dem Decodieren wieder in diesem Zeichensatz sein . In den folgenden Abschnitten werden die beiden Standardcodierungsmechanismen definiert. Die Definition neuer Content-Transfer-Encodierungen wird explizit entmutigt und sollte nur dann auftreten, wenn es absolut notwendig ist. Der gesamte Content-Transfer-Encoding-Namespace mit Ausnahme derjenigen, die mit X beginnen, wird explizit für die zukünftige Verwendung der IANA reserviert. Auch private Vereinbarungen über Content-Transfer-Verschlüsselungen werden explizit abgeraten. Bestimmte Content-Transfer-Encoding-Werte dürfen nur auf bestimmten Content-Typen verwendet werden. Insbesondere ist es ausdrücklich verboten, alle Codierungen, die nicht 7bit, 8bit oder binary sind, mit einem Content-Type zu verwenden, der rekursiv andere Content-Type-Felder enthält, insbesondere die Multipart - und Message-Content-Typen. Alle Kodierungen, die für Körper des Typs Multipart oder Message erwünscht sind, müssen auf der innersten Ebene durch Codierung des eigentlichen Körpers, der codiert werden muss, durchgeführt werden. Ich schreibe einen einfachen Webserver in Python, der es einem Benutzer erlaubt, eine Datei mit multipart / form hochzuladen - Daten. Soweit ich sagen kann, müssen Multipart-MIME-Daten line-basiert sein. Zum Beispiel muss die Grenze am Anfang einer Zeile sein. Ich kann nicht herausfinden, wie binäre Daten in dieser Hinsicht behandelt wird. Mein Client (Firefox) ist nicht Kodierung in 7bit ASCII oder etwas, seine nur rohe binäre Daten sein Senden. Gibt es eine maximale Zeilenlänge angegeben für Multipart-Daten Ive versucht, die Suche durch die RFC für Multipart / Form-Daten, aber nicht etwas finden. Gefragt Mar 27 13 am 16:54 Nach dem Graben durch die RFCs, ich glaube, ich endlich habe es alle direkt in meinem Kopf. Die Körperteile (d. h. der Körperinhalt eines einzelnen Teils in einer Multipart / Nachricht) müssen nur auf Linie basieren, indem die Grenze am Ende des Teils mit einer CRLF beginnt. Aber sonst müssen die Daten nicht zeilenbasiert sein, und wenn der Inhalt mit Zeilenumbrüchen in es geschieht, gibt es keine maximale Distanz zwischen ihnen, noch müssen sie in irgendeiner Weise entkommen (gut, es sei denn, die Content-Transfer - Encoding ist zitiert-string). Die 7-Bit-, 8-Bit - und Binäroptionen für Content-Transfer-Encoding deuten nicht darauf hin, dass jede Codierung auf den Daten durchgeführt wurde (und daher keine Codierung rückgängig gemacht werden muss), sondern nur die Art der Daten angeben Können Sie erwarten, in der Körperpartie zu sehen. Was ich in meiner schlecht ausgedrückten Frage wirklich war, war, wie man die Daten aus dem Sockel lastet / puffert, so dass ich sicherstellen konnte, dass ich die Grenze fing und ohne einen willkürlich großen Puffer haben musste (zB wenn es nicht passiert war Zeilenumbrüche in den Inhalt, und so eine Readline endete bis Pufferung der gesamten Sache). Was ich am Ende zu tun war Pufferung aus dem Sockel mit einer readline mit einer maximalen Länge, so dass der Puffer wäre nie länger als das, sondern würde auch sicher zu beenden, wenn ein Zeilenumbruch angetroffen wurde. Dies stellte sicher, dass, wenn die Grenze kam (nach einer CRLF), es wäre am Anfang des Puffers. Ich musste ein wenig extra monkeying, um sicherzustellen, dass ich nicht enthalten, dass endgültige CRLF in der eigentlichen Körper Inhalt, weil nach dem RFC seine erforderlich vor der Grenze, und daher nicht Teil des Inhalts selbst. Antwort # 2 am 12:02 Versuchen Sie die Überprüfung RFC 2045. Normalerweise wird binärer Inhalt von Ihrer Anwendung in BASE64 konvertiert und in der Multi-Part-Nachricht mit Content-Transfer-Encoding enthalten. Base64. Es gibt andere Mechanismen, um binäre Daten zu übertragen, aber das ist sehr häufig. Binärdaten werden in Bytes konvertiert und in Arbitrationslängen (abhängig von der Kodierungsvariante - siehe BASE64-Link oben) aufgeteilt. Die empfangene Anwendung decodiert sie dann in den ursprünglichen binären Inhalt. Ich bin nicht ein Python-Programmierer, aber ich würde überrascht sein, dass Sie wirklich zu jeder dieser Code. Ich vermute, es gibt vorgebaute Python-Bibliothek Funktionen, dies für Sie zu tun. Beantwortet Mar 27 13 am 17:43 Danke, ich war auf einen anderen RFC, die nicht so informativ war. Ich fand auch RFC 2046, die spezifisch mehrteilige Meldungen in Abschnitt 5 definiert. Anmerkung there39s ein bisschen eine Subtilität in diesen RFCs, die durch mich weg: es sagt, dass mehrteilige Meldungen keine anderen Kodierungen als 7-bit, 8-bit und binary haben können (Dh nicht Base-64). Allerdings kann man sagen, dass die einzelnen Teile innerhalb des Multi-Teils eigene Content-Kodierungen haben können, so dass Sie korrekt sind, dass Base-64 möglich ist. Ndash brianmearns Ihre Antwort 2016 Stack Exchange, Inc5 Das Content-Transfer-Encoding-Headerfeld Viele Content-Typen, die sinnvoll per E-Mail transportiert werden können, werden in ihrem natürlichen Format als 8-Bit-Zeichen oder binär dargestellt Daten. Solche Daten können nicht über einige Transportprotokolle übertragen werden. Beispielsweise beschränkt RFC 821 Mail-Nachrichten auf 7-Bit-US-ASCII-Daten mit 1000 Zeichenzeilen. Es ist daher notwendig, einen Standardmechanismus zum Neukodieren solcher Daten in ein 7-Bit-Kurzzeilenformat zu definieren. Dieses Dokument legt fest, dass diese Codierungen durch ein neues Content-Transfer-Encoding-Header-Feld angezeigt werden. Das Feld Content-Transfer-Encoding wird verwendet, um die Art der Transformation anzuzeigen, die verwendet wurde, um den Körper in einer akzeptablen Weise für den Transport darzustellen. Im Gegensatz zu Content-Typen ist eine Verbreitung von Content-Transfer-Encoding-Werten unerwünscht und unnötig. Allerdings ist es nicht möglich, nur einen einzigen Content-Transfer-Encoding-Mechanismus einzurichten. Es besteht ein Kompromiss zwischen dem Wunsch nach einer kompakten und effizienten Codierung von weitgehend binären Daten und dem Wunsch nach einer lesbaren Codierung von Daten, die meist, aber nicht vollständig, 7-Bit-Daten sind. Aus diesem Grund sind mindestens zwei Codierungsmechanismen notwendig: eine lesbare Codierung und eine dichte Codierung. Das Feld Content-Transfer-Encoding ist so konzipiert, dass es eine invertierbare Abbildung zwischen der nativen Repräsentation eines Datentyps und einer Repräsentation angeben kann, die unter Verwendung von 7-Bit-Mail-Transportprotokollen, wie den von RFC 821 (SMTP) definierten, leicht ausgetauscht werden kann. Dieses Feld wurde nicht durch einen früheren Standard definiert. Der Feldwert ist ein einzelnes Token, das die Art der Codierung spezifiziert, wie unten aufgelistet. Formal: Bei diesen Werten wird nicht zwischen Groß - und Kleinschreibung unterschieden. Das heißt, Base64 und BASE64 und bAsE64 sind alle äquivalent. Ein Kodierungstyp von 7BIT erfordert, dass sich der Körper bereits in einer Sieben-Bit-Mail-Ready-Darstellung befindet. Dies ist der Standardwert, dh Content-Transfer-Encoding: 7BIT wird angenommen, wenn das Header-Feld Content-Transfer-Encoding nicht vorhanden ist. Die Werte 8bit, 7bit und binary bedeuten alle, dass NO-Codierung durchgeführt wurde. Sie sind jedoch potentiell nützlich als Hinweise auf die Art der Daten, die in dem Objekt enthalten sind, und daher auf die Art der Codierung, die für die Übertragung in einem gegebenen Transportsystem erforderlich sein muss. 7bit bedeutet, dass die Daten alle als kurze Zeilen von US-ASCII-Daten dargestellt werden. 8bit bedeutet, dass die Zeilen kurz sind, aber es können nicht-ASCII-Zeichen (Oktette mit dem Bit höherer Ordnung) vorhanden sein. Binary bedeutet, dass nicht nur nicht-ASCII-Zeichen vorhanden sein können, sondern auch, dass die Zeilen nicht unbedingt kurz genug für den SMTP-Transport sind. Der Unterschied zwischen 8bit (oder irgendeinem anderen denkbaren Bitbreiten-Token) und dem binären Token besteht darin, dass binär keine Adhärenz an irgendwelchen Grenzen der Leitungslänge oder der SMTP-CRLF-Semantik erfordert, während die Bitbreiten-Token eine solche Adhärenz erfordern. Wenn der Körper Daten in einer anderen Bit-Breite als 7-Bit enthält, muss das geeignete Bit-Breite-Content-Transfer-Encoding-Token verwendet werden (z. B. 8 Bit für nichtcodierte 8 Bit breite Daten). Wenn der Körper binäre Daten enthält, muss das binäre Content-Transfer-Encoding-Token verwendet werden. Die Unterscheidung zwischen den Content-Transfer-Encoding-Werten von Binär, 8bit usw. mag unwichtig erscheinen, da alle von ihnen wirklich keine bedeuten - das heißt, es gab keine Verschlüsselung der Daten für den Transport. Allerdings ist eine klare Kennzeichnung von enormer Bedeutung für Gateways zwischen zukünftigen Post-Transportsystemen mit unterschiedlichen Fähigkeiten beim Transport von Daten, die nicht den Beschränkungen des RFC 821-Transports entsprechen. Seit der Veröffentlichung dieses Dokuments gibt es keine standardisierten Internet-Transporte, für die es erlaubt ist, unverschlüsselte 8-Bit - oder Binärdaten in Poststellen einzubinden. So gibt es keine Umstände, in denen die 8bit oder binäre Content-Transfer-Encoding ist eigentlich legal im Internet. Wenn jedoch 8-Bit - oder binärer Posttransport in Internetpost Realität wird oder wenn dieses Dokument in Verbindung mit einem anderen 8-Bit - oder binärfähigen Transportmechanismus verwendet wird, sollten 8-Bit - oder binäre Körper markiert werden Als solche unter Verwendung dieses Mechanismus. Die fünf Werte, die für das Feld "Content-Transfer-Encoding" definiert wurden, bedeuten nichts anderes als den Algorithmus, für den es codiert wurde, oder das Transportsystem, wenn es uncodiert ist. Implementoren können, falls erforderlich, neue Inhalte-Transfer-Codierungswerte definieren, müssen aber ein x-Token verwenden, bei dem es sich um einen durch X vorangestellten Namen handelt, um seinen Nicht-Standardstatus anzugeben, z. B. Content-Transfer-Codierung: x-my-new-encoding. Im Gegensatz zu den Content-Typen und Subtypen ist die Erstellung neuer Werte für die Content-Transfer-Codierung jedoch explizit und stark entmutigt, da sie wahrscheinlich die Interoperabilität mit wenig potenziellen Vorteilen behindern. Ihre Verwendung ist nur als Ergebnis einer Vereinbarung zwischen kooperierenden Verwenderagenten erlaubt. Wenn ein Header-Feld Content-Transfer-Encoding als Teil eines Nachrichten-Headers erscheint, gilt es für den gesamten Text dieser Nachricht. Wenn ein Content-Transfer-Encoding-Header-Feld als Teil eines Body-Parts-Headers erscheint, gilt es nur für den Körper dieses Körperteils. Wenn eine Entität vom Typ multipart oder message ist, ist es der Content-Transfer-Codierung nicht gestattet, einen anderen Wert als eine Bitbreite (z. B. 7bit, 8bit usw.) oder binär zu haben. Es ist anzumerken, dass E-Mail zeichenorientiert ist, so dass die hier beschriebenen Mechanismen Mechanismen zum Codieren von beliebigen Byte-Strömen und nicht Bitströmen sind. Wenn ein Bitstrom über einen dieser Mechanismen codiert werden soll, muss er zuerst unter Verwendung der Netzwerk-Standard-Bitreihenfolge (big-endian) in einen 8-Bit-Byte-Strom umgewandelt werden, wobei die älteren Bits in einem Strom die höherwertigen Bits werden, Bits in einem Byte. Ein Bitstrom, der nicht an einer 8-Bit-Grenze endet, muss mit Nullen aufgefüllt werden. Dieses Dokument bietet einen Mechanismus, um die Hinzufügung einer solchen Polsterung im Falle der Anwendung Content-Type, die einen Polsterungsparameter aufweist, zu notieren. Die hier definierten Codierungsmechanismen codieren explizit alle Daten in ASCII. Angenommen, eine Entity hat Header-Felder wie: Dies sollte interpretiert werden, um zu bedeuten, dass der Körper eine base64 ASCII-Codierung von Daten ist, die ursprünglich in ISO-8859-1 war, und wird in diesem Zeichensatz wieder nach Decodierung sein . In den folgenden Abschnitten werden die beiden Standardcodierungsmechanismen definiert. Die Definition neuer Content-Transfer-Encodierungen ist explizit entmutigt und sollte nur dann auftreten, wenn dies unbedingt erforderlich ist. Der gesamte Content-Transfer-Encoding-Namespace mit Ausnahme derjenigen, die mit X beginnen, wird explizit für die zukünftige Verwendung der IANA reserviert. Auch private Vereinbarungen über Content-Transfer-Verschlüsselungen werden explizit abgeraten. Bestimmte Content-Transfer-Encoding-Werte dürfen nur auf bestimmten Content-Typen verwendet werden. Insbesondere ist es ausdrücklich verboten, alle Codierungen, die nicht 7bit, 8bit oder binär sind, mit einem Content-Type zu verwenden, der rekursiv andere Content-Type-Felder enthält, insbesondere die Multipart - und Message-Content-Typen. Alle Codierungen, die für Körper des Typs multipart oder Message gewünscht sind, müssen auf der innersten Ebene durchgeführt werden, indem der eigentliche Körper codiert wird, der codiert werden muss. HINWEISE FÜR ENCODING-BESCHRÄNKUNGEN: Obwohl das Verbot der Verwendung von Content-Transfer-Verschlüsselungen auf Daten vom Typ Multipart oder Meldung übermäßig restriktiv wirken kann, ist es notwendig, verschachtelte Verschlüsselungen zu verhindern, bei denen Daten mehrmals durch einen Verschlüsselungsalgorithmus weitergegeben werden Mehrfach decodiert, um richtig betrachtet zu werden. Verschachtelte Codierungen verleihen den Benutzeragenten erhebliche Komplexität: Abgesehen von den offensichtlichen Effizienzproblemen mit solchen Mehrfachcodierungen können sie die Grundstruktur einer Nachricht verdecken. Insbesondere können sie bedeuten, dass mehrere Decodierungsoperationen einfach notwendig sind, um herauszufinden, welche Arten von Objekten eine Nachricht enthält. Das Verbieten von verschachtelten Verschlüsselungen kann den Job bestimmter Mail-Gateways komplizieren, aber dies scheint weniger ein Problem als die Wirkung von verschachtelten Verschlüsselungen auf Benutzeragenten zu sein. HINWEIS ZUR VERHÄLTNIS ZWISCHEN INHALT UND INHALT-TRANSFER-KODIERUNG Es scheint, dass die Content-Transfer-Codierung aus den Eigenschaften des zu codierenden Content-Typs abgeleitet werden könnte, oder zumindest gewiss Content-Transfer-Encodings können für bestimmte Content-Typen verwendet werden. Es gibt mehrere Gründe, warum dies nicht der Fall ist. Angesichts der unterschiedlichen Arten von Transporten, die für Post verwendet werden, können einige Codierungen für einige Inhaltsart / Transportkombinationen und nicht für andere geeignet sein. (Zum Beispiel wäre bei einem 8-Bit-Transport keine Kodierung für Text in bestimmten Zeichensätzen erforderlich, während solche Kodierungen eindeutig für 7-Bit-SMTP erforderlich sind.) Zweitens können bestimmte Inhaltstypen unter Umständen unterschiedliche Arten von Übertragungscodierungen erfordern Unterschiedlichen Umständen. Beispielsweise können viele PostScript-Körper vollständig aus kurzen Zeilen von 7-Bit-Daten bestehen und daher wenig oder keine Codierung erfordern. Andere PostScript-Körper (insbesondere solche, die den Binärcodierungsmechanismus von Level 2 PostScripts verwenden) können nur mit einer binären Transportcodierung sinnvoll dargestellt werden. Da Content-Type schließlich ein Open-Ended-Spezifikationsmechanismus sein soll, verbindet die strikte Spezifikation einer Assoziation zwischen Content-Typen und Codierungen effektiv die Spezifikation eines Anwendungsprotokolls mit einem spezifischen Transport auf niedrigerer Ebene. Dies ist nicht wünschenswert, da die Entwickler eines Content-Typs nicht über alle verwendeten Transporte und deren Beschränkungen wissen müssen. HINWEIS ÜBER TRANSLATING ENCODINGS Die quoted-printable - und base64-Codierungen sind so konzipiert, dass eine Konvertierung zwischen ihnen möglich ist. Das einzige Problem, das bei einer solchen Umwandlung auftritt, ist die Handhabung von Zeilenumbrüchen. Beim Umwandeln von quoted-printable in base64 muss ein Zeilenumbruch in eine CRLF-Sequenz umgewandelt werden. Ebenso sollte eine CRLF-Sequenz in base64-Daten in einen quoted-printable Zeilenumbruch konvertiert werden, aber NUR beim Konvertieren von Textdaten. ANMERKUNG ÜBER KANONISCHES KODIERUNGSMODELL: Es gab einige Verwirrung in früheren Entwürfen dieses Memos bezüglich des Modells, wann E-Mail-Daten in kanonische Form umgewandelt und verschlüsselt werden sollten, und insbesondere, wie sich dieser Prozess auf die Behandlung von CRLFs auswirken würde Die Darstellung der Zeilenumbrüche variiert stark von System zu System. Aus diesem Grund ist ein kanonisches Modell für die Kodierung als Anhang H dargestellt. 5.1 Zitat-Printable Content-Transfer-Encoding Die Zitat-Printable-Kodierung soll Daten darstellen, die weitgehend aus Bytes bestehen, die mit druckbaren Zeichen im ASCII-Zeichensatz übereinstimmen. Er kodiert die Daten so, dass die resultierenden Bytes kaum durch einen Posttransport modifiziert werden können. Sind die codierten Daten meist ASCII-Text, so bleibt die codierte Form der Daten weitgehend vom Menschen erkennbar. Ein Körper, der vollständig ASCII ist, kann auch in Quoted-Printable codiert werden, um die Integrität der Daten zu gewährleisten, sollte die Nachricht durch ein Zeichenübertragungs - und / oder Zeilenumbruch-Gateway passieren. In dieser Codierung sind Oktette anzugeben, die durch die folgenden Regeln bestimmt werden: Regel 1: (Allgemeine 8-Bit-Darstellung) Jedes Oktett, mit Ausnahme derjenigen, die einen Zeilenumbruch gemäß der Newline-Konvention der kanonischen Form der codierten Daten angeben, Kann durch eine zweistellige hexadezimale Darstellung des Oktetts-Werts dargestellt werden. Die Ziffern des hexadezimalen Alphabets sind zu diesem Zweck 0123456789ABCDEF. Großbuchstaben müssen beim Senden von hexadezimalen Daten verwendet werden, obwohl eine robuste Implementierung die Erkennung von Kleinbuchstaben beim Empfang beschließen kann. So kann beispielsweise der Wert 12 (ASCII Form Feed) durch 0C dargestellt werden, und der Wert 61 (ASCII EQUAL SIGN) kann durch 3D dargestellt werden. Außer wenn die folgenden Regeln eine alternative Codierung zulassen, ist diese Regel obligatorisch. Regel 2: (wörtliche Darstellung) Octets mit Dezimalwerten von 33 bis einschließlich 60 und 62 bis einschließlich 126 können als ASCII-Zeichen dargestellt werden, die diesen Oktetten entsprechen (EXKLAMATIONSPUNKT bis WENIGER ALS und GRÖßER ALS bis TILDE) ). Regel 3: (White Space) Octets mit Werten von 9 und 32 können als ASCII TAB (HT) bzw. SPACE Zeichen dargestellt werden, aber MUSS NICHT so am Ende einer codierten Zeile dargestellt werden. Alle TAB - (HT-) oder SPACE-Zeichen auf einer codierten Zeile MÜSSEN also auf dieser Zeile mit einem druckbaren Zeichen befolgt werden. Insbesondere kann am Ende einer codierten Zeile ein weicher Zeilenumbruch (siehe Regel 5) einem oder mehreren TAB (HT) - oder SPACE-Zeichen folgen. Daraus folgt, dass ein Oktett mit dem Wert 9 oder 32, das am Ende einer codierten Zeile erscheint, gemäß Regel 1 dargestellt werden muss. Diese Regel ist notwendig, da einige MTAs (Message Transport Agents, Programme, die Nachrichten von einem Benutzer zum anderen transportieren oder durchführen Ein Teil dieser Transfers) bekannt sind, um Textzeilen mit SPACE aufzufüllen, und andere sind dafür bekannt, Leerraumzeichen vom Ende einer Zeile zu entfernen. Daher muss bei der Decodierung eines Quoted-Printable-Körpers jeder nachgestellte Leerraum auf einer Zeile gelöscht werden, da er notwendigerweise durch Zwischen-Transportmittel hinzugefügt worden ist. Regel 4 (Zeilenumbrüche) Ein Zeilenumbruch in einem Textkörperteil, unabhängig davon, was seine Darstellung der kanonischen Darstellung der zu codierenden Daten folgt, muss durch einen Zeilenumbruch (RFC 822) dargestellt werden, der eine CRLF-Folge ist Die Zitat-Druckbare Codierung. Wenn isolierte CRs und LFs oder LF CR - und CR LF-Sequenzen in Binärdaten gemäß der kanonischen Form erscheinen dürfen, müssen sie unter Verwendung der 0D-, 0A-, 0A0D - und 0D0A-Notationen dargestellt werden. Beachten Sie, dass viele Implementierungen wählen können, um die lokale Darstellung verschiedener Inhaltstypen direkt zu codieren. Dies kann insbesondere für Klartextmaterial auf Systemen gelten, die andere Newline-Konventionen als CRLF-Trennzeichen verwenden. Eine solche Implementierung ist zulässig, aber die Erzeugung von Zeilenumbrüchen muss verallgemeinert werden, um dem Fall Rechnung zu tragen, in dem alternative Repräsentationen von Newline-Sequenzen verwendet werden. Regel 5 (Soft Line Breaks) Die Zitat-Printable-Codierung ERFORDERT, dass codierte Zeilen nicht mehr als 76 Zeichen lang sein dürfen. Sollen längere Zeilen mit der Quoted-Printable-Codierung codiert werden, müssen weiche Zeilenumbrüche verwendet werden. Ein Gleichheitszeichen als letztes Zeichen auf einer codierten Zeile zeigt einen solchen nicht signifikanten (weichen) Zeilenumbruch im codierten Text an. Wenn also die rohe Form der Zeile eine einzige unverschlüsselte Zeile ist, die besagt, dass dies in der Zitat-Printable-Codierung dargestellt werden kann, da dies einen Mechanismus darstellt, mit dem lange Zeilen so codiert werden, dass sie vom Benutzer wiederhergestellt werden Agent. Die 76-Zeichen-Grenze zählt nicht die nachlaufende CRLF, sondern zählt alle anderen Zeichen, einschließlich beliebiger Gleichheitszeichen. Da das Bindestrich-Zeichen (-) in der Quoted-Printable-Kodierung als selbst dargestellt wird, muss bei der Verkapselung eines quoted-printable-kodierten Körpers in einer multipart-Entität darauf geachtet werden, dass die Kapselungsgrenze nicht irgendwo im kodierten Körper erscheint . (Eine gute Strategie besteht darin, eine Grenze zu wählen, die eine Zeichenfolge enthält, wie sie in einer quoted-printable-Leiste nicht angezeigt werden kann.) HINWEIS: Die quoted-printable-Codierung stellt etwas von a dar Kompromiss zwischen Lesbarkeit und Zuverlässigkeit im Transport. Die mit der quoted-printable-Codierung codierten Dateien funktionieren zuverlässig über den meisten Mail-Gateways, funktionieren jedoch nicht einwandfrei über wenige Gateways, insbesondere solche, die eine Übersetzung in EBCDIC beinhalten. (In der Theorie könnte ein EBCDIC-Gateway eine quoted-printable-Stelle decodieren und sie mit base64 neu codieren, aber solche Gateways existieren noch nicht.) Ein höheres Vertrauen wird durch die base64 Content-Transfer-Codierung geboten. Eine Möglichkeit, einen vernünftig zuverlässigen Transport über EBCDIC-Gateways zu erhalten, ist auch die Angabe der ASCII-Zeichen gemäß Regel 1. Siehe Anhang B für weitere Informationen. Da zitiert-druckbare Daten im allgemeinen als zeilenorientiert angenommen werden, ist zu erwarten, daß die Pausen zwischen den Zeilen der zitierten druckbaren Daten im Transport geändert werden können, und zwar in der gleichen Weise, wie Klartextpost in Internetpost immer geändert wurde Beim Übergang zwischen Systemen mit unterschiedlichen Newline-Konventionen. Wenn solche Änderungen wahrscheinlich eine Beschädigung der Daten darstellen, ist es vermutlich sinnvoller, die base64-Codierung anstelle der quoted-printable-Codierung zu verwenden. 5.2 Base64 Content-Transfer-Encoding Die Base64 Content-Transfer-Codierung ist dazu bestimmt, beliebige Sequenzen von Bytes in einer Form darzustellen, die nicht menschlich lesbar ist. Die Codierungs - und Decodierungsalgorithmen sind einfach, aber die codierten Daten sind konsequent nur etwa 33 Prozent größer als die nichtcodierten Daten. Diese Codierung basiert auf der in Privacy Enhanced Mail-Anwendungen verwendeten Definition, wie in RFC 1113 definiert. Die Base64-Codierung wird von RFC 1113 mit einer Änderung angepasst: base64 beseitigt den Mechanismus für eingebetteten Klartext. Eine 65-stellige Teilmenge von US-ASCII wird verwendet, so dass für jedes druckbare Zeichen 6 Bits repräsentiert werden können. HINWEIS: Diese Teilmenge hat die wichtige Eigenschaft, dass sie in allen Versionen von ISO 646, einschließlich US-ASCII, identisch dargestellt wird, und alle Zeichen in der Teilmenge sind ebenfalls dargestellt. (Das zusätzliche 65. Zeichen wird zur Bezeichnung einer speziellen Verarbeitungsfunktion verwendet Identisch in allen Versionen von EBCDIC. Andere populäre Codierungen, wie die Codierung, die von dem UUENCODE-Dienstprogramm und der base85-Codierung verwendet wird, die als Teil von PostScript für PostScript 2 angegeben wird, teilen diese Eigenschaften nicht und erfüllen daher nicht die Anforderungen an die Portabilität, die eine binäre Transportkodierung für E-Mails erfüllen muss. Der Codierungsprozess stellt 24-Bit-Gruppen von Eingangs-Bits als Ausgangs-Strings mit 4 codierten Zeichen dar. Von links nach rechts wird eine 24-Bit-Eingangsgruppe durch Verknüpfen von 3 8-Bit-Eingangsgruppen gebildet. Diese 24 Bits werden dann als 4 verkettete 6-Bit-Gruppen behandelt, die jeweils in einer einzigen Ziffer im base64-Alphabet übersetzt werden. Beim Codieren eines Bitstroms über die base64-Codierung muß angenommen werden, daß der Bitstrom mit dem höchstwertigsten Bit geordnet ist. Das heißt, das erste Bit in dem Strom wird das Bit höherer Ordnung im ersten Byte sein, und das achte Bit wird das Bit niedriger Ordnung im ersten Byte sein, und so weiter. Jede 6-Bit-Gruppe wird als Index in ein Array mit 64 druckbaren Zeichen verwendet. Das Zeichen, auf das durch den Index verwiesen wird, wird in den Ausgabestring platziert. Diese Zeichen, die in der nachstehenden Tabelle 1 identifiziert sind, werden so ausgewählt, daß sie universell darstellbar sind, und der Satz schließt Zeichen mit besonderer Bedeutung für SMTP (z. B. CR, LF) und die in diesem Dokument definierten Einkapselungsgrenzen (z. . Tabelle 1: Das Base64-Alphabet Der Ausgangsstrom (codierte Bytes) muss in Zeilen mit maximal 76 Zeichen dargestellt werden. Alle Zeilenumbrüche oder andere Zeichen, die in Tabelle 1 nicht gefunden werden, müssen durch Decodierungssoftware ignoriert werden. In base64-Daten bedeuten Zeichen, die sich von denen in Tabelle 1 unterscheiden, Zeilenumbrüche und andere Leerzeichen wahrscheinlich auf einen Übertragungsfehler, um den eine Warnmeldung oder sogar eine Nachrichtenabweisung unter bestimmten Umständen geeignet sein könnte. Eine spezielle Verarbeitung wird durchgeführt, wenn weniger als 24 Bits am Ende der codierten Daten verfügbar sind. Ein volles Kodierungsquantum wird immer am Ende eines Körpers vollendet. Wenn weniger als 24 Eingangs-Bits in einer Eingangsgruppe zur Verfügung stehen, werden Null-Bits (auf der rechten Seite) hinzugefügt, um eine ganze Zahl von 6-Bit-Gruppen zu bilden. Ausgabezeichenpositionen, die nicht erforderlich sind, um tatsächliche Eingangsdaten darzustellen, werden auf das Zeichen gesetzt. Da alle Base64-Inputs eine ganzzahlige Anzahl von Oktetts sind, können nur die folgenden Fälle auftreten: (1) das endgültige Quantum der Codierungseingabe ist ein ganzzahliges Vielfaches von 24 Bits hier, die endgültige Einheit der codierten Ausgabe wird ein ganzzahliges Vielfaches von 4 Zeichen sein (2) das Endquantum der Codierungseingabe ist exakt 8 Bits, die Endeinheit der codierten Ausgabe zwei Zeichen, gefolgt von zwei Füllzeichen, oder (3) das Endquantum der Codierungseingabe ist genau 16 Bits hier , Ist die letzte Einheit der codierten Ausgabe drei Zeichen, gefolgt von einem Füllzeichen. Es ist darauf zu achten, die richtigen Oktetts für Zeilenumbrüche zu verwenden, wenn base64-Codierung direkt auf Textmaterial angewendet wird, das nicht in kanonische Form umgewandelt wurde. Insbesondere sollten Textzeilenpausen vor der Base64-Codierung in CRLF-Sequenzen konvertiert werden. Das Wichtigste ist, dass dies direkt durch den Codierer statt in einem vorherigen Kanonisierungsschritt in einigen Implementierungen durchgeführt werden kann. HINWEIS: Es gibt keine Notwendigkeit, über die Angabe von scheinbaren Kapselungsgrenzen in base64-kodierten Teilen von Multipart-Entitäten zu sorgen, da in der base64-Kodierung keine Bindestrichzeichen verwendet werden.


No comments:

Post a Comment