Base64-Längenberechnung?
Nach dem Lesen der base64 - wiki ...
Ich versuche, herauszufinden, wie der Formel arbeiten :
Gegeben ein string mit der Länge von n
, die base64-Länge
Ist : 4*Math.Ceiling(((double)s.Length/3)))
Weiß ich schon, dass die base64-Länge muss %4==0
zu erlauben, dass der decoder wissen, was war der ursprüngliche text Länge.
Die max Anzahl der Polsterung für eine Sequenz können =
oder ==
.
wiki :Die Anzahl Ausgabe-bytes pro Eingabe-byte ist etwa 4 /3 (33%
overhead)
Frage:
Wie keine Informationen über sich mit dem Ausgang Länge ?
InformationsquelleAutor der Frage Royi Namir | 2012-11-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jedes Zeichen wird verwendet, um darzustellen, 6 bits (
log2(64) = 6
).Also 4 chars stehen für
4 * 6 = 24 bits = 3 bytes
.So müssen Sie
4*(n/3)
chars zu vertretenn
bytes, und dies muss aufgerundet auf ein Vielfaches von 4 ist.Die Anzahl der nicht verwendeten Polsterung chars, die aus dem aufrunden auf ein Vielfaches von 4 ist, wird offensichtlich sein, 0, 1, 2 oder 3.
InformationsquelleAutor der Antwort Paul R
4 * n /3
gibt ohne Pad Länge.Und rundet auf das nächste Vielfache von 4 für Polsterung, und 4 ist eine Potenz von 2 kann bitweise logische Operationen zu.
InformationsquelleAutor der Antwort Ren
Referenz, der Base64-encoder-Länge der Formel ist wie folgt:
Als Sie sagte, die eine Base64-encoder gegeben
n
Byte Daten produziert einen string, der4n/3
Base64-Zeichen. Anders ausgedrückt, alle 3 bytes der Daten wird das Ergebnis im 4-Base64 Zeichen. BEARBEITEN: EINEN Kommentar richtig darauf hin, dass meine vorherigen Grafik nicht angemeldet für Polsterung; die richtige Formel istCeiling(4n/3)
.Wikipedia-Artikel zeigt genau an, wie die ASCII-Zeichenfolge
Man
kodiert in Base64-stringTWFu
in seinem Beispiel. Der input-string ist 3 bytes oder 24 bits, in der Größe, so dass die Formel richtig vorhersagt die Ausgabe erfolgt in 4 bytes (oder 32 bits) long:TWFu
. Der Prozess kodiert alle 6 bits von Daten in die 64-Base64 Zeichen, also die 24-bit-Eingang, geteilt durch 6 ergibt 4 Base64-Zeichen.Fragen Sie in einem Kommentar, was die Größe der Kodierung
123456
wäre. Wenn man bedenkt, dass jeder jedes Zeichen von string 1 byte oder 8 bits, Größe (vorausgesetzt, ASCII/UTF8-Codierung), wir sind Codierung 6 bytes oder 48 bits von Daten. Nach der Gleichung erwarten wir, dass die Ausgabe der Länge zu(6 bytes /3 bytes) * 4 characters = 8 characters
.Setzen
123456
in einen Base64-encoder erzeugtMTIzNDU2
8 Zeichen lang, so wie wir es erwartet haben.InformationsquelleAutor der Antwort David Schwartz
Ich denke, dass die gegebenen Antworten verfehlen den Punkt von der ursprünglichen Frage, ist, wie viel Platz muss reserviert werden, um fit die base64-Codierung für einen gegebenen binären string der Länge n bytes.
Die Antwort ist
(floor(n /3) + 1) * 4 + 1
Dies beinhaltet Polsterung und einem abschließenden null-Zeichen. Sie können nicht auf dem Boden nennen, wenn Sie tun, integer-Arithmetik.
Einschließlich Polsterung, die eine base64-Zeichenfolge erfordert vier bytes für jedes drei-byte-chunk der ursprünglichen Zeichenfolge, einschließlich unvollständige chunks. Ein oder zwei bytes extra am Ende der Zeichenfolge wird noch umgewandelt zu vier bytes bei der base64-Zeichenfolge, wenn ein padding Hinzugefügt. Es sei denn, Sie haben eine ganz bestimmte Anwendung, ist es am besten fügen Sie die Polsterung, in der Regel ein ist-gleich-Zeichen. Ich fügte hinzu, ein zusätzliches byte für das null-Zeichen in C, da ASCII-strings, die ohne diese sind ein wenig gefährlich und man würde Sie brauchen, um die Länge der Zeichenfolge getrennt.
InformationsquelleAutor der Antwort Ian Nartowicz
Ganzzahlen
In der Regel, die wir nicht nutzen wollen, verdoppelt, weil wir nicht wollen, verwenden Sie die " floating point ops, Rundungsfehler etc. Sie sind einfach nicht notwendig.
Dazu ist es eine gute Idee, sich daran zu erinnern, wie die Decke division:
ceil(x /y)
im Doppelzimmer kann geschrieben werden als(x + y - 1) /y
(während die Vermeidung negativer zahlen, aber hüten Sie sich vor überlauf).Lesbar
Wenn Sie gehen für eine bessere Lesbarkeit können Sie natürlich auch eine Programm wie dieses (Beispiel in Java, C, die Sie nutzen könnten Makros, natürlich):
Inline
Gepolsterte
Wir wissen, dass wir nur 4 Zeichen-Blöcke an der Zeit für jeweils 3 bytes (oder weniger). So ist dann die Formel wird (für x = n und y = 3):
oder kombiniert:
dein compiler optimieren wird, aus der
3 - 1
so lassen Sie es wie diese zu erhalten Lesbarkeit.Ohne Pad
Weniger verbreitet ist die Variante ohne Pad, für dieses wir uns daran erinnern, dass jeder, brauchen wir ein Zeichen für jeweils 6 bits, aufgerundet:
oder kombiniert:
können wir aber noch durch zwei teilen (wenn wir wollen):
Unlesbar
In Fall, dass Sie nicht Vertrauen Ihrem compiler zu tun, die letzten Optimierungen für Sie (oder wenn Sie wollen, zu verwirren Sie Ihren Kollegen):
Gepolsterte
Ohne Pad
Da sind wir, zwei logische Möglichkeiten der Berechnung, und wir brauchen keine Filialen, bit-ops oder modulo-ops - wenn wir es wirklich wollen.
Hinweise:
InformationsquelleAutor der Antwort Maarten Bodewes
Hier ist eine Funktion zum berechnen der ursprünglichen Größe einer Base-64-codierte Datei als String in KB:
InformationsquelleAutor der Antwort Pedro Silva
Scheint mir, dass die richtige Formel sollte sein:
InformationsquelleAutor der Antwort Valo
Während alle anderen debattieren, algebraischen Formeln, die ich lieber nur BASE64 sich, mir zu sagen:
525
710
So scheint es, ist die Formel 3 bytes repräsentiert wird durch 4 base64-Zeichen scheint korrekt zu sein.
InformationsquelleAutor der Antwort Michael Adams
In windows - ich wollte Schätzung der Größe der mime64 Größe Puffer, aber genaue Berechnung Formel funktionierte nicht für mich - schließlich habe ich endete mit der ungefähren Formel wie diese:
Mine64 string Zuordnung Größe (ungefähr)
= (((4 * ((binary buffer size) + 1)) /3) + 1)
Also Letzte +1 - es ist für ascii-null - Letzte Zeichen muss für die Speicherung der null endet - aber warum "binary buffer size" + 1 - ich vermute, dass es einige mime64-terminierungszeichen ? Oder kann dies einige alignment-Problem.
InformationsquelleAutor der Antwort TarmoPikaro
Ich glaube, das ist noch eine genaue Antwort, wenn n%3 nicht null, nicht ?
Mathematica version :
Spaß haben
GI
InformationsquelleAutor der Antwort igerard