Ihre Schlussfolgerung, dass Polsterung nicht erforderlich ist, ist richtig. Es ist immer möglich, die Länge der Eingabe eindeutig aus der Länge der codierten Sequenz zu bestimmen.
Das Auffüllen ist jedoch in Situationen nützlich, in denen Base64-codierte Zeichenfolgen so verkettet sind, dass die Längen der einzelnen Sequenzen verloren gehen, wie dies beispielsweise in einem sehr einfachen Netzwerkprotokoll der Fall sein kann.
Wenn ungepolsterte Zeichenfolgen verkettet sind, können die Originaldaten nicht wiederhergestellt werden, da Informationen über die Anzahl der ungeraden Bytes am Ende jeder einzelnen Sequenz verloren gehen. Wenn jedoch aufgefüllte Sequenzen verwendet werden, gibt es keine Mehrdeutigkeit, und die Sequenz als Ganzes kann korrekt decodiert werden.
Bearbeiten: Eine Illustration
Angenommen, wir haben ein Programm, das Wörter mit base64 codiert, verkettet und über ein Netzwerk sendet. Es codiert "I", "AM" und "TJM", fügt die Ergebnisse ohne Auffüllen zusammen und überträgt sie.
I
codiert zu SQ
( SQ==
mit Polsterung)
AM
codiert zu QU0
( QU0=
mit Polsterung)
TJM
codiert zu VEpN
( VEpN
mit Polsterung)
Die übertragenen Daten sind also SQQU0VEpN
. Der Empfänger base64-decodiert dies I\x04\x14\xd1Q)
anstelle der beabsichtigten IAMTJM
. Das Ergebnis ist Unsinn, weil der Absender Informationen darüber zerstört hat, wo jedes Wort in der codierten Sequenz endet . Wenn der Absender SQ==QU0=VEpN
stattdessen gesendet hätte, hätte der Empfänger dies als drei separate base64-Sequenzen dekodieren können, die sich verketten würden, um zu geben IAMTJM
.
Warum sich mit Polsterung beschäftigen?
Warum nicht einfach das Protokoll so gestalten, dass jedem Wort eine ganzzahlige Länge vorangestellt wird? Dann könnte der Empfänger den Stream korrekt dekodieren und es wäre kein Auffüllen erforderlich.
Das ist eine großartige Idee, solange wir die Länge der Daten kennen, die wir codieren, bevor wir mit der Codierung beginnen. Aber was wäre, wenn wir anstelle von Worten Videostücke von einer Live-Kamera codieren würden? Wir kennen möglicherweise nicht die Länge jedes Stücks im Voraus.
Wenn das Protokoll eine Auffüllung verwenden würde, wäre es überhaupt nicht erforderlich, eine Länge zu übertragen. Die Daten könnten codiert werden, wenn sie von der Kamera eingehen, wobei jeder Block mit Auffüllen abgeschlossen wird, und der Empfänger könnte den Stream korrekt decodieren.
Natürlich ist das ein sehr ausgeklügeltes Beispiel, aber vielleicht zeigt es, warum Polsterung in manchen Situationen möglicherweise hilfreich ist.
In diesem Zusammenhang finden Sie hier einen Basiskonverter für eine beliebige Basiskonvertierung, den ich für Sie erstellt habe. Genießen! https://convert.zamicol.com/
Was sind Polsterzeichen?
Füllzeichen erfüllen die Längenanforderungen und haben keine Bedeutung.
Dezimalbeispiel für das Auffüllen: Angesichts der willkürlichen Anforderung, dass alle Zeichenfolgen 8 Zeichen lang sind, kann die Zahl 640 diese Anforderung erfüllen, indem vorhergehende Nullen als Auffüllzeichen verwendet werden, da sie keine Bedeutung haben, "00000640".
Binäre Codierung
Das Byte-Paradigma: Das Byte ist die De-facto-Standardmaßeinheit, und jedes Codierungsschema muss sich auf Bytes beziehen.
Base256 passt genau in dieses Paradigma. Ein Byte entspricht einem Zeichen in base256.
Base16 , hexadezimal oder hexadezimal, verwendet 4 Bits für jedes Zeichen. Ein Byte kann zwei base16-Zeichen darstellen.
Base64 passt im Gegensatz zu base256 und base16 nicht gleichmäßig in das Byte-Paradigma (und base32 auch nicht). Alle base64-Zeichen können in 6 Bit dargestellt werden, 2 Bit vor einem vollständigen Byte.
Wir können die Base64-Codierung gegenüber dem Byte-Paradigma als Bruch darstellen: 6 Bits pro Zeichen über 8 Bits pro Byte . Dieser Bruchteil wurde um 3 Bytes über 4 Zeichen reduziert.
Dieses Verhältnis, 3 Bytes pro 4 Base64-Zeichen, ist die Regel, die wir beim Codieren von Base64 befolgen möchten. Die Base64-Codierung kann nur das Messen mit 3-Byte-Bündeln versprechen, im Gegensatz zu base16 und base256, bei denen jedes Byte für sich stehen kann.
Also , warum ist Polsterung ermutigt , obwohl Codierung sehr gut ohne die Füllzeichen funktionieren könnte?
Wenn die Länge eines Streams unbekannt ist oder wenn es hilfreich sein kann, genau zu wissen, wann ein Datenstrom endet, verwenden Sie Padding. Die Füllzeichen weisen ausdrücklich darauf hin, dass diese zusätzlichen Stellen leer sein sollten, und schließen Mehrdeutigkeiten aus. Selbst wenn die Länge beim Auffüllen unbekannt ist, wissen Sie, wo Ihr Datenstrom endet.
Als Gegenbeispiel erlauben einige Standards wie JOSE das Auffüllen von Zeichen nicht. In diesem Fall funktioniert eine kryptografische Signatur nicht, wenn etwas fehlt, oder es fehlen andere Nicht-Base64-Zeichen (wie das "."). Obwohl keine Annahmen über die Länge getroffen werden, ist keine Polsterung erforderlich, da etwas einfach nicht funktioniert, wenn etwas nicht stimmt.
Und genau das sagt der base64 RFC:
Durch das Auffüllen können wir die Base64-Codierung mit dem Versprechen dekodieren, dass keine Bits verloren gehen. Ohne Auffüllen gibt es keine explizite Bestätigung mehr, dass in drei Byte-Bündeln gemessen wird. Ohne Auffüllen können Sie möglicherweise keine exakte Reproduktion der Originalcodierung ohne zusätzliche Informationen garantieren, die normalerweise von einer anderen Stelle in Ihrem Stapel stammen, z. B. TCP, Prüfsummen oder andere Methoden.
Beispiele
Hier ist das Beispielformular RFC 4648 ( http://tools.ietf.org/html/rfc4648#section-8 )
Jedes Zeichen in der Funktion "BASE64" verwendet ein Byte (base256). Wir übersetzen das dann in base64.
Hier ist ein Encoder, mit dem Sie herumspielen können: http://www.motobit.com/util/base64-decoder-encoder.asp
quelle
char*
benötigen Sie entweder die Größe der Zeichenfolge oder einen Nullterminator. Polsterung ist überflüssig. Daher die Frage von OP.Es hat heutzutage nicht viel Nutzen. Betrachten wir dies als eine Frage des ursprünglichen historischen Zwecks.
Die Base64-Codierung erscheint erstmals in RFC 1421 vom Jahr 1993. Diese RFC konzentriert sich eigentlich auf die Verschlüsselung von E-Mails, und Base64 wird in einem kleinen Abschnitt 4.3.2.4 beschrieben .
Dieser RFC erklärt nicht den Zweck der Auffüllung. Am nächsten an der Erwähnung des ursprünglichen Zwecks ist dieser Satz:
Es wird weder eine Verkettung (Top-Antwort hier) noch eine einfache Implementierung als expliziter Zweck für das Auffüllen vorgeschlagen. In Anbetracht der gesamten Beschreibung ist es jedoch nicht unangemessen anzunehmen, dass dies dem Decoder helfen soll, die Eingabe in 32-Bit-Einheiten ( "Quanten" ) zu lesen . Dies ist heute nicht mehr von Vorteil, jedoch hätte ein unsicherer C-Code 1993 diese Eigenschaft höchstwahrscheinlich tatsächlich ausgenutzt.
quelle
b'Zm9vYmFyZm9vYg==' b'Zm9vYmFyZm9vYmE=' b'Zm9vYmFyZm9vYmFy' b'Zm9vYmFyZm9vYmFyZg==' b'Zm9vYmFyZm9vYmFyZm8=' b'Zm9vYmFyZm9vYmFyZm9v'
ist die gleiche wie die vonb'Zm9vYmFyZm9vYg=' b'Zm9vYmFyZm9vYmE=' b'Zm9vYmFyZm9vYmFy=' b'Zm9vYmFyZm9vYmFyZg=' b'Zm9vYmFyZm9vYmFyZm8=' b'Zm9vYmFyZm9vYmFyZm9v='