Base64: qual è il peggior aumento possibile nell'uso dello spazio?


167

Se un server ha ricevuto una stringa base64 e voleva controllarne la lunghezza prima della conversione, supponiamo che volesse consentire sempre all'array di byte finale di essere 16 KB. Quanto potrebbe diventare grande un array di byte da 16 KB quando convertito in una stringa Base64 (assumendo un byte per carattere)?

Risposte:


243

Base64 codifica ogni set di tre byte in quattro byte. Inoltre, l'output è imbottito per essere sempre un multiplo di quattro.

Ciò significa che la dimensione della rappresentazione base 64 di una stringa di dimensione n è:

ceil(n / 3) * 4

Quindi, per un array da 16kB, la rappresentazione base-64 sarà ceil (16 * 1024/3) * 4 = lunghezza 21848 byte ~ = 21,8kB.

Un grezzo approssimazione sarebbe che la dimensione dei dati è aumentata a 4/3 dell'originale.


Dobbiamo aggiungere 2 alla lunghezza o no?
vIceBerg,

@vIceBerg, dipende dal fatto che si utilizzi ceilcon floatnumeri o solo intnumeri. (e no ceil)
Bryan Field,

7
Immagino che il modo più semplice per dirlo sia aggiungere 1/3 delle dimensioni originali.
mvmn,

1
Nell'esempio che hai proposto, mostrare il risultato nello stesso ordine di misura aumenterebbe un po 'la qualità della risposta (21,3 KB anziché 21848 byte).
Ivan De Paz Centeno,

36

Da Wikipedia

Si noti che dato un input di n byte, l'output sarà lungo (n + 2 - ((n + 2)% 3)) / 3 * 4 byte, quindi il numero di byte di output per byte di input converge in 4/3 o 1.33333 per n.

Quindi 16kb * 4/3 fornisce molto poco più di 21,3 'kb, o 21848 byte, per l'esattezza.

Spero che questo ti aiuti


11

16kb è 131.072 bit. Base64 racchiude i buffer a 24 bit in quattro caratteri a 6 bit ciascuno, quindi si otterrebbero 5.462 * 4 = 21.848 byte.


5

Poiché la domanda riguardava il peggior aumento possibile, devo aggiungere che di solito ci sono interruzioni di riga intorno a ogni 80 caratteri. Ciò significa che se si stanno salvando i dati codificati in base64 in un file di testo su Windows, verranno aggiunti 2 byte, su Linux 1 byte per ogni riga.

L'aumento rispetto alla codifica effettiva è stato descritto sopra.


3
Il caso estremo in cui 1 byte sorgente diventa 4 byte base64, quindi un aumento di 4x? Qualsiasi materiale di origine più lungo ottiene un rapporto migliore fino a quando, come altri hanno già detto, si avvicina asintoticamente a 1.333 ...
Olie,

1

Questo è un riferimento futuro per me stesso. Poiché la domanda è nel caso peggiore , dovremmo prendere in considerazione le interruzioni di riga. Mentre RFC 1421 definisce la lunghezza massima della linea pari a 64 caratteri, RFC 2045 (MIME) afferma che ci sarebbero al massimo 76 caratteri in una riga.

Quest'ultimo è ciò che la libreria C # ha implementato. Quindi in ambiente Windows in cui un'interruzione di riga è di 2 caratteri (\ r \ n), otteniamo questo:Length = Floor(Ceiling(N/3) * 4 * 78 / 76)

Nota: Flooring è perché durante il mio test con C #, se l'ultima riga termina esattamente a 76 caratteri, non segue alcuna interruzione di riga.

Posso provarlo eseguendo il seguente codice:

byte[] bytes = new byte[16 * 1024];
Console.WriteLine(Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks).Length);

La risposta per 16 kByte codificati in base64 con 76 righe di caratteri: 22422 caratteri

Supponiamo che in Linux lo sarebbe, Length = Floor(Ceiling(N/3) * 4 * 77 / 76)ma non ho ancora provato a provarlo sul mio core .NET.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.