Wikipedia sagt
Base64-Codierungsschemata werden häufig verwendet, wenn Binärdaten codiert werden müssen, die gespeichert und über Medien übertragen werden müssen, die für den Umgang mit Textdaten ausgelegt sind. Dies soll sicherstellen, dass die Daten während des Transports unverändert bleiben.
Aber ist es nicht so, dass Daten immer binär gespeichert / übertragen werden, weil der Speicher, den unsere Maschinen haben, binär gespeichert ist und es nur davon abhängt, wie Sie sie interpretieren? Unabhängig davon, ob Sie das Bitmuster 010011010110000101101110
wie Man
in ASCII oder TWFu
in Base64 codieren , werden Sie schließlich dasselbe Bitmuster speichern.
Wenn die endgültige Codierung in Nullen und Einsen besteht und jede Maschine und jedes Medium damit umgehen kann, wie spielt es dann eine Rolle, ob die Daten als ASCII oder Base64 dargestellt werden?
Was bedeutet "Medien, die für den Umgang mit Textdaten ausgelegt sind"? Sie können mit Binär umgehen => sie können mit allem umgehen.
Vielen Dank an alle, ich glaube ich verstehe jetzt.
Wenn wir Daten senden, können wir nicht sicher sein, dass die Daten im gleichen Format interpretiert werden, wie wir es beabsichtigt haben. Wir senden also Daten, die in einem Format (wie Base64) codiert sind, das beide Parteien verstehen. Auf diese Weise werden die Daten auch dann nicht falsch interpretiert, wenn Sender und Empfänger dieselben Dinge unterschiedlich interpretieren. Da sie sich jedoch auf das codierte Format einigen.
Aus dem Beispiel von Mark Byers
Wenn ich senden möchte
Hello
world!
Eine Möglichkeit besteht darin, es wie in ASCII zu senden
72 101 108 108 111 10 119 111 114 108 100 33
Byte 10 wird jedoch möglicherweise nicht korrekt als Zeilenumbruch am anderen Ende interpretiert. Wir verwenden also eine Teilmenge von ASCII, um es so zu codieren
83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61
Dies sorgt auf Kosten von mehr Daten, die für dieselbe Informationsmenge übertragen werden, dafür, dass der Empfänger die Daten auf die beabsichtigte Weise decodieren kann, selbst wenn der Empfänger für den Rest des Zeichensatzes unterschiedliche Interpretationen hat.
Antworten:
Ihr erster Fehler besteht darin, dass die ASCII-Codierung und die Base64-Codierung austauschbar sind. Sie sind nicht. Sie werden für verschiedene Zwecke verwendet.
Um zu verstehen, warum Base64 überhaupt notwendig war, benötigen wir eine kleine Computergeschichte.
Computer kommunizieren in Binärform - Nullen und Einsen -, aber die Benutzer möchten normalerweise mit umfangreicheren Formulardaten wie Text oder Bildern kommunizieren. Um diese Daten zwischen Computern zu übertragen, müssen sie zuerst in Nullen und Einsen codiert, gesendet und dann erneut decodiert werden. Um Text als Beispiel zu nehmen: Es gibt viele verschiedene Möglichkeiten, diese Codierung durchzuführen. Es wäre viel einfacher, wenn wir uns alle auf eine einzige Kodierung einigen könnten, aber leider ist dies nicht der Fall.
Ursprünglich wurden viele verschiedene Codierungen erstellt (z. B. Baudot-Code ), die eine unterschiedliche Anzahl von Bits pro Zeichen verwendeten, bis schließlich ASCII mit 7 Bits pro Zeichen zum Standard wurde. Die meisten Computer speichern Binärdaten jedoch in Bytes mit jeweils 8 Bit, sodass ASCII für die Übertragung dieser Art von Daten ungeeignet ist. Einige Systeme würden sogar das höchstwertige Bit löschen. Darüber hinaus bedeutet der Unterschied in den Zeilenendcodierungen zwischen den Systemen, dass die ASCII-Zeichen 10 und 13 manchmal auch geändert wurden.
Um diese Probleme zu lösen, wurde die Base64- Codierung eingeführt. Auf diese Weise können Sie beliebige Bytes in Bytes codieren, von denen bekannt ist, dass sie sicher gesendet werden können, ohne beschädigt zu werden (alphanumerische ASCII-Zeichen und einige Symbole). Der Nachteil ist, dass die Codierung der Nachricht mit Base64 die Länge erhöht - alle 3 Datenbytes werden in 4 ASCII-Zeichen codiert.
Um Text zuverlässig Sie können senden erste kodieren zu Bytes mit einem Textcodierung Ihrer Wahl (zB UTF-8) und dann anschließend Base64 kodieren die resultierenden Binärdaten in einer Textzeichenfolge , die sicher als ASCII senden verschlüsselt. Der Empfänger muss diesen Vorgang umkehren, um die ursprüngliche Nachricht wiederherzustellen. Dies setzt natürlich voraus, dass der Empfänger weiß, welche Codierungen verwendet wurden, und diese Informationen müssen häufig separat gesendet werden.
In der Vergangenheit wurde es verwendet, um Binärdaten in E-Mail-Nachrichten zu codieren, bei denen der E-Mail-Server möglicherweise die Zeilenenden ändert. Ein moderneres Beispiel ist die Verwendung der Base64-Codierung, um Bilddaten direkt in HTML-Quellcode einzubetten . Hier müssen die Daten codiert werden, um zu vermeiden, dass Zeichen wie '<' und '>' als Tags interpretiert werden.
Hier ist ein Arbeitsbeispiel:
Ich möchte eine Textnachricht mit zwei Zeilen senden:
Wenn ich es als ASCII (oder UTF-8) sende, sieht es folgendermaßen aus:
Das Byte 10 ist in einigen Systemen beschädigt, sodass wir diese Bytes als Base64-Zeichenfolge codieren können:
Was bei Codierung mit ASCII folgendermaßen aussieht:
Alle Bytes hier sind als sichere Bytes bekannt, daher besteht nur eine sehr geringe Wahrscheinlichkeit, dass ein System diese Nachricht beschädigt. Ich kann dies anstelle meiner ursprünglichen Nachricht senden und den Empfänger den Vorgang umkehren lassen, um die ursprüngliche Nachricht wiederherzustellen.
quelle
Codierung von Binärdaten in XML
Angenommen, Sie möchten einige Bilder in ein XML-Dokument einbetten. Die Bilder sind Binärdaten, während das XML-Dokument Text ist. XML kann jedoch keine eingebetteten Binärdaten verarbeiten. Wie machst du das?
Eine Möglichkeit besteht darin, die Bilder in base64 zu codieren und die Binärdaten in Text umzuwandeln, den XML verarbeiten kann.
Anstatt:
Sie machen:
Der XML-Parser kann das XML-Dokument korrekt analysieren und die Bilddaten extrahieren.
quelle
.mht
Format von Microsoft funktionieren (HTML-Datei + Bilder in einer einzigen Datei).Schauen Sie sich den RFC an, der derzeit Base64 definiert .
Base64 wurde ursprünglich entwickelt, um das Anhängen von Binärdaten an E-Mails als Teil der Mehrzweck-Internet-Mail-Erweiterungen zu ermöglichen.
quelle
Medien, die für Textdaten entwickelt wurden, sind natürlich letztendlich auch binär, aber Textmedien verwenden häufig bestimmte Binärwerte für Steuerzeichen. Außerdem können Textmedien bestimmte Binärwerte als Nicht-Text ablehnen.
Die Base64-Codierung codiert Binärdaten als Werte, die nur als Text in Textmedien interpretiert werden können, und ist frei von Sonderzeichen und / oder Steuerzeichen, sodass die Daten auch über Textmedien hinweg erhalten bleiben.
quelle
Es ist mehr so, dass das Medium die Zeichenfolgencodierung validiert , daher möchten wir sicherstellen, dass die Daten von einer Handhabungsanwendung akzeptiert werden (und keine binäre Sequenz enthalten, die beispielsweise EOL darstellt).
Stellen Sie sich vor, Sie möchten Binärdaten in einer E-Mail mit UTF-8-Codierung senden. - Die E-Mail wird möglicherweise nicht richtig angezeigt, wenn der Strom von Einsen und Nullen eine Sequenz erstellt, die in UTF-8-Codierung keinen gültigen Unicode enthält.
Das Gleiche passiert in URLs, wenn wir Zeichen codieren möchten, die für eine URL in der URL selbst nicht gültig sind:
Dies liegt daran, dass wir einen Raum über ein System senden möchten, das den Raum für stinkend hält.
Wir stellen lediglich sicher, dass eine 1: 1-Zuordnung zwischen einer bekannten guten, akzeptablen und nicht schädlichen Folge von Bits zu einer anderen wörtlichen Folge von Bits besteht und dass die Handhabungsanwendung die Codierung nicht unterscheidet .
In Ihrem Beispiel ist
man
möglicherweise ASCII in der ersten Form gültig. Oft möchten Sie jedoch Werte übertragen, die zufällig binär sind (dh ein Bild in einer E-Mail senden):Hier sehen wir, dass ein GIF-Bild in base64 als Teil einer E-Mail codiert ist. Der E-Mail-Client liest die Header und dekodiert sie. Aufgrund der Codierung können wir sicher sein, dass das GIF nichts enthält, was als Protokoll interpretiert werden könnte, und wir vermeiden das Einfügen von Daten, die SMTP oder POP möglicherweise als signifikant erachten.
quelle
Base64 anstatt Sonderzeichen zu entkommen
Ich gebe Ihnen ein ganz anderes, aber reales Beispiel: Ich schreibe Javascript-Code, der in einem Browser ausgeführt werden soll. HTML-Tags haben ID-Werte, es gibt jedoch Einschränkungen hinsichtlich der Gültigkeit von Zeichen in einer ID.
Ich möchte jedoch, dass meine ID verlustfrei auf Dateien in meinem Dateisystem verweist. Dateien in der Realität können alle möglichen seltsamen und wunderbaren Zeichen enthalten, von Ausrufezeichen über Zeichen mit Akzent bis hin zu Tilde und sogar Emoji! Ich kann das nicht tun:
Angenommen, ich möchte einen Code wie diesen ausführen:
Ich denke, dieser Code wird bei der Ausführung fehlschlagen.
Mit Base64 kann ich mich auf etwas Kompliziertes beziehen, ohne mir Gedanken darüber zu machen, welche Sprache welche Sonderzeichen zulässt und welche entkommen müssen:
Im Gegensatz zur Verwendung eines MD5 oder einer anderen Hashing-Funktion können Sie die Codierung umkehren, um herauszufinden, welche Daten genau tatsächlich nützlich waren.
Ich wünschte, ich wüsste vor Jahren von Base64. Ich hätte es vermieden, mir mit '
encodeURIComponent
' und die Haare auszureißenstr.replace(‘\n’,’\\n’)
SSH-Übertragung von Text:
Wenn Sie versuchen, komplexe Daten über ssh zu übertragen (z. B. eine Punktdatei, damit Sie Ihre Shell-Personalisierungen erhalten können), viel Glück ohne Base 64. So würden Sie es mit Base 64 machen (ich weiß, dass Sie SCP verwenden können, Dies würde jedoch mehrere Befehle erfordern - was die Schlüsselbindungen für das Sshing in einen Server erschwert):
quelle
Ein Beispiel dafür, wann ich es praktisch fand, war der Versuch, Binärdaten in XML einzubetten . Einige der Binärdaten wurden vom SAX-Parser falsch interpretiert, da diese Daten buchstäblich alles sein können, einschließlich XML-Sonderzeichen. Base64, das die Daten auf der sendenden Seite codiert und auf der empfangenden Seite decodiert, hat dieses Problem behoben.
quelle
Die meisten Computer speichern Daten im 8-Bit-Binärformat, dies ist jedoch keine Voraussetzung. Einige Maschinen und Übertragungsmedien können jeweils nur 7 Bit (oder sogar weniger) verarbeiten. Ein solches Medium würde den Stream in Vielfachen von 7 Bit interpretieren. Wenn Sie also 8-Bit-Daten senden, erhalten Sie auf der anderen Seite nicht das, was Sie erwarten. Base-64 ist nur eine Möglichkeit, dieses Problem zu lösen: Sie codieren die Eingabe in ein 6-Bit-Format, senden sie über Ihr Medium und decodieren sie auf der Empfangsseite zurück in das 8-Bit-Format.
quelle
Zusätzlich zu den anderen (etwas langwierigen) Antworten: Selbst wenn alte Systeme ignoriert werden, die nur 7-Bit-ASCII unterstützen, sind grundlegende Probleme bei der Bereitstellung von Binärdaten im Textmodus:
quelle
Diese Protokolle wurden entwickelt, um Text (oft nur englischen Text) anstelle von Binärdaten (wie PNG- und JPG-Bilder) zu verarbeiten.
Aber das Gegenteil ist nicht wahr. Ein Protokoll zur Darstellung von Text behandelt möglicherweise Binärdaten, die Folgendes enthalten:
Sie können also nicht einfach Binärdaten über ein textbasiertes Protokoll senden. Sie sind auf die Bytes beschränkt, die die Nicht-Leerzeichen-Nicht-Kontroll-ASCII-Zeichen darstellen, von denen es 94 gibt. Der Grund, warum Base 64 ausgewählt wurde, war, dass es schneller ist, mit Zweierpotenzen zu arbeiten, und 64 ist das größte, das funktioniert .
Zumindest im Web haben sie meistens. Die meisten Websites verwenden UTF-8 .
Das Problem im Westen ist, dass es eine Menge alter Software gibt, die 1 Byte = 1 Zeichen annimmt und nicht mit UTF-8 funktioniert.
Das Problem im Osten ist ihre Bindung an Codierungen wie GB2312 und Shift_JIS.
Und die Tatsache, dass Microsoft immer noch nicht darüber hinweggekommen zu sein scheint, die falsche UTF-Codierung ausgewählt zu haben. Wenn Sie die Windows-API oder die Microsoft C-Laufzeitbibliothek verwenden möchten, sind Sie auf UTF-16 oder die "ANSI" -Codierung des Gebietsschemas beschränkt. Dies macht es schmerzhaft, UTF-8 zu verwenden, da Sie ständig konvertieren müssen.
quelle
Warum / Wie verwenden wir die Base64-Codierung?
Base64 ist eines der Binär-Text-Codierungsschemata mit einer Effizienz von 75%. Es wird verwendet, damit typische Binärdaten (wie Bilder) sicher über ältere "nicht 8-Bit-Clean" -Kanäle gesendet werden können. In früheren E-Mail-Netzwerken (bis Anfang der neunziger Jahre) waren die meisten E-Mail-Nachrichten Klartext im 7-Bit-US-ASCII-Zeichensatz. So viele frühe Kommunikationsprotokollstandards wurden entwickelt, um über "7-Bit" -Kommunikationsverbindungen "nicht 8-Bit-sauber" zu arbeiten. Die Schemaeffizienz ist das Verhältnis zwischen der Anzahl der Bits in der Eingabe und der Anzahl der Bits in der codierten Ausgabe. Hexadezimal (Base16) ist auch eines der Binär-Text-Codierungsschemata mit einer Effizienz von 50%.
Base64-Codierungsschritte (vereinfacht):
quelle
Damals, als ASCII die Welt regierte, war der Umgang mit Nicht-ASCII-Werten ein Problem. Die Leute sprangen durch alle möglichen Reifen, um diese über den Draht zu übertragen, ohne Informationen zu verlieren.
quelle