1043 Stimmen

Wozu dient die Base-64-Kodierung?

Ich habe gehört, dass hier und da von "Base 64 Encoding" die Rede ist. Wofür wird sie verwendet?

9 Stimmen

Aus dem Handbuch für base64_encode() : "Diese Kodierung wurde entwickelt, damit binäre Daten den Transport durch Transportschichten überstehen, die nicht 8-Bit sauber sind, wie z.B. Mail-Bodies."

1240voto

Dave Markle Punkte 91733

Wenn Sie Binärdaten über ein Netzwerk übertragen wollen, tun Sie dies in der Regel nicht, indem Sie die Bits und Bytes einfach in einem Rohformat über die Leitung streamen. Warum? Weil einige Medien für das Streaming von Text ausgelegt sind. Man weiß nie - einige Protokolle könnten Ihre Binärdaten als Steuerzeichen interpretieren (wie ein Modem), oder Ihre Binärdaten könnten vermasselt werden, weil das zugrunde liegende Protokoll denkt, dass Sie eine spezielle Zeichenkombination eingegeben haben (wie FTP Zeilenenden übersetzt).

Um dies zu umgehen, werden die binären Daten in Zeichen kodiert. Base64 ist einer dieser Codierungstypen.

Warum 64?
Denn im Allgemeinen kann man sich darauf verlassen, dass dieselben 64 Zeichen in vielen Zeichensätzen vorhanden sind, und man kann einigermaßen sicher sein, dass die Daten auf der anderen Seite der Leitung unbeschädigt ankommen.

130 Stimmen

(Theoretisch könnte man Base-80-Codierung oder etwas Ähnliches machen, aber das wäre wesentlich schwieriger. Zweierpotenzen sind natürliche Basen für Binärzahlen).

16 Stimmen

@yokees: Es gibt keine Garantie, es sind nur Zeichen, die fast immer sicher. Aus diesem Grund gibt es mehrere Formen von Base-64 ( de.wikipedia.org/wiki/Base-64 ).

2 Stimmen

@Jon - welche Variante verwendet der Browser, wenn ich Base64 in ein Bild-Tag einfüge?

276voto

Jon Skeet Punkte 1325502

Es ist im Grunde eine Möglichkeit, beliebige Binärdaten in ASCII-Text zu kodieren. Es werden 4 Zeichen pro 3 Byte Daten benötigt, plus möglicherweise ein bisschen Füllmaterial am Ende.

Im Wesentlichen werden alle 6 Bits der Eingabe in einem 64-Zeichen-Alphabet kodiert. Das "Standard"-Alphabet verwendet A-Z, a-z, 0-9 sowie + und /, mit = als Auffüllzeichen. Es gibt URL-sichere Varianten.

Wikipedia ist eine recht gute Quelle für weitere Informationen.

0 Stimmen

In einer Sprache wie php, woher kommen die binären Daten. Wir arbeiten fast immer mit String-Daten, die Text sind.

5 Stimmen

@CholthiPaulTtiopic: Die Ergebnisse von Verschlüsselung oder Komprimierung, oder Ton/Bilder/Video.

0 Stimmen

Wie sieht es mit der Speicherung aus, php scheint keinen binären Datentyp zu haben

241voto

Rajesh Prajapati Punkte 1581

Vor Jahren, als die Mailing-Funktionalität eingeführt wurde, war sie noch rein textbasiert, doch im Laufe der Zeit kam der Bedarf an Anhängen wie Bildern und Medien (Audio, Video usw.) auf. Wenn diese Anhänge über das Internet verschickt werden (im Wesentlichen in Form von Binärdaten), ist die Wahrscheinlichkeit, dass die Binärdaten in ihrer Rohform beschädigt werden, hoch. Um dieses Problem in den Griff zu bekommen, wurde BASE64 entwickelt.

Das Problem bei Binärdaten ist, dass sie Null-Zeichen enthalten, die in einigen Sprachen wie C, C++ das Ende einer Zeichenkette darstellen. Das Senden von Binärdaten in Rohform, die NULL-Bytes enthalten, führt dazu, dass eine Datei nicht vollständig gelesen werden kann und die Daten beschädigt werden.

Zum Beispiel:

In C und C++ zeigt dieses "Null"-Zeichen das Ende einer Zeichenkette an. So wird "HELLO" wie folgt gespeichert:

H E L L O

72 69 76 76 79 00

Der 00 sagt "hier anhalten".

Nun wollen wir uns ansehen, wie die BASE64-Kodierung funktioniert.

Zu beachtende Punkte: Die Länge der Zeichenkette sollte ein Vielfaches von 3 sein.

Beispiel 1 :

Zu kodierende Zeichenfolge : "ace", Länge=3

  1. Konvertieren Sie jedes Zeichen in eine Dezimalzahl.

a= 97, c= 99, e= 101

enter image description here

  1. Ändern Sie jede Dezimalzahl in eine 8-Bit-Binärdarstellung.

97= 01100001, 99= 01100011, 101= 01100101

Kombiniert : 01100001 01100011 01100101

  1. Getrennt in einer Gruppe von 6-Bit.

011000 010110 001101 100101

  1. Binär nach Dezimal berechnen

011000= 24, 010110= 22, 001101= 13, 100101= 37

  1. Konvertierung dezimaler Zeichen in base64 mithilfe der base64-Tabelle.

24= Y, 22= W, 13= N, 37= l

"ace" => "YWNl"

enter image description here

Beispiel 2 :

Zu kodierende Zeichenkette: "abcd" Länge=4, kein Vielfaches von 3. Um die Länge der Zeichenkette auf ein Vielfaches von 3 zu bringen, müssen wir 2 Bits hinzufügen, damit die Länge= 6 ist. Das Auffüllungsbit wird durch das Zeichen "=" dargestellt.

Zu beachtende Punkte: Ein Padding-Bit entspricht zwei Nullen 00, zwei Padding-Bits entsprechen vier Nullen 0000.

Beginnen wir also den Prozess :-

  1. Konvertieren Sie jedes Zeichen in eine Dezimalzahl.

a= 97, b= 98, c= 99, d= 100

  1. Ändern Sie jede Dezimalzahl in eine 8-Bit-Binärdarstellung.

97= 01100001, 98= 01100010, 99= 01100011, 100= 01100100

  1. Getrennt in einer Gruppe von 6-Bit.

011000, 010110, 001001, 100011, 011001, 00

Da die letzten 6 Bits nicht vollständig sind, fügen wir zwei Auffüllbits ein, die vier Nullen "0000" ergeben.

011000, 010110, 001001, 100011, 011001, 000000 ==

Jetzt ist es gleich. Zwei Gleichheitszeichen am Ende zeigen, dass 4 Nullen addiert wurden (hilft bei der Entschlüsselung).

  1. Berechnen Sie binär nach dezimal.

011000= 24, 010110= 22, 001001= 9, 100011= 35, 011001= 25, 000000=0 ==

  1. Konvertierung dezimaler Zeichen in base64 mit Hilfe der base64-Tabelle.

24= Y, 22= W, 9= j, 35= j, 25= Z, 0= A ==

"abcd" => "YWJjZA=="

156voto

Brad Wilson Punkte 64944

Bei der Base-64-Kodierung werden binäre Daten in Text umgewandelt, damit sie z. B. in E-Mails und HTML-Formularen leichter übertragen werden können.

http://en.wikipedia.org/wiki/Base64

133voto

Ates Goral Punkte 132294

Es handelt sich um eine textuelle Kodierung von Binärdaten, bei der der resultierende Text nur aus Buchstaben, Zahlen und den Symbolen "+", "/" und "=" besteht. Es ist eine bequeme Art, binäre Daten über Medien zu speichern/übertragen, die speziell für Textdaten verwendet werden.

Aber warum Base-64? Die beiden Alternativen für die Umwandlung von Binärdaten in Text, die mir sofort einfallen, sind:

  1. Dezimal: Speichern Sie den Dezimalwert jedes Bytes als drei Zahlen: 045 112 101 037 usw., wobei jedes Byte durch 3 Bytes dargestellt wird. Die Daten werden dreifach aufgebläht.
  2. Hexadezimal: Speichern Sie die Bytes als Hex-Paare: AC 47 0D 1A usw., wobei jedes Byte durch 2 Bytes dargestellt wird. Die Daten blähen sich zweifach auf.

Base-64 bildet 3 Bytes (8 x 3 = 24 Bits) in 4 Zeichen ab, die sich über 6 Bits (6 x 4 = 24 Bits) erstrecken. Das Ergebnis sieht etwa so aus: "TWFuIGlzIGRpc3Rpb...". Die Aufblähung beträgt also nur das 4/3 = 1,3333333-fache des Originals.

14 Stimmen

Verstehe ich das richtig, dass 64 die beste Wahl ist, da es die höchste Zweierpotenz ist, die in ein druckbares ASCII-Zeichen umgewandelt werden kann (es gibt 95 davon)?

0 Stimmen

Wenn es sich in beiden Fällen um 24 Bit handelt, ist dann die Aufblähung nicht 1:1? Oder wenn Sie sagen, 4 Zeichen, die sich über 6 Bits erstrecken, meinen Sie, dass es eigentlich 8 Bits pro Zeichen gibt, aber die ersten beiden sind aufgefüllte 0s?

1 Stimmen

@Backwards_Dave Jeweils 6 Bits werden in 8 Bits ausgedrückt. Die Aufblähung ist also 8:6, oder 4:3.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X