Base64: ¿Cuál es el peor aumento posible en el uso del espacio?

167

Si un servidor recibió una cadena base64 y quería verificar su longitud antes de la conversión, digamos que siempre permitió que la matriz de bytes final fuera de 16 KB. ¿Qué tan grande podría llegar a ser una matriz de bytes de 16 KB cuando se convierte en una cadena Base64 (suponiendo un byte por carácter)?

Bryan Field
fuente

Respuestas:

243

Base64 codifica cada conjunto de tres bytes en cuatro bytes. Además, la salida se rellena para que siempre sea un múltiplo de cuatro.

Esto significa que el tamaño de la representación en base 64 de una cadena de tamaño n es:

ceil(n / 3) * 4

Entonces, para una matriz de 16kB, la representación de base 64 será ceil (16 * 1024/3) * 4 = 21848 bytes de longitud ~ = 21.8kB.

Una aproximación aproximada sería que el tamaño de los datos aumenta a 4/3 del original.

R. Martinho Fernandes
fuente
¿Necesitamos agregar 2 a la longitud o no?
vIceBerg
@vIceBerg, Depende de si se está utilizando ceilcon floatnúmeros, o sólo intnúmeros. (y no ceil)
Bryan Field
77
Supongo que la forma más simple de decir esto es agregar 1/3 del tamaño original.
mvmn
1
En el ejemplo que propuso, mostrar el resultado en el mismo orden de medida aumentaría un poco la calidad de la respuesta (21,3 KB en lugar de 21848 Bytes).
Ivan De Paz Centeno
36

De Wikipedia

Tenga en cuenta que, dada una entrada de n bytes, la salida será (n + 2 - ((n + 2)% 3)) / 3 * 4 bytes de longitud, de modo que el número de bytes de salida por byte de entrada converja a 4/3 o 1.33333 para n grande.

Entonces 16kb * 4/3 da muy poco más de 21.3 'kb, o 21848 bytes, para ser exactos.

Espero que esto ayude

Binario Worrier
fuente
11

16kb son 131,072 bits. Base64 empaqueta memorias intermedias de 24 bits en cuatro caracteres de 6 bits cada uno, por lo que tendría 5,462 * 4 = 21,848 bytes.

Chris Heald
fuente
5

Dado que la pregunta era sobre el peor aumento posible, debo agregar que generalmente hay saltos de línea alrededor de cada 80 caracteres. Esto significa que si está guardando datos codificados en base64 en un archivo de texto en Windows, agregará 2 bytes, en Linux 1 byte para cada línea.

El aumento de la codificación real se ha descrito anteriormente.

Zsolt Sky
fuente
3
¿No es el caso extremo de que 1 byte de origen se convierta en 4 bytes base64, por lo que un aumento de 4x? Cualquier material fuente más largo obtiene una mejor proporción hasta que, como han dicho otros, se acerca asintóticamente a 1.333 ...
Olie
1

Esta es una referencia futura para mí. Como la pregunta es sobre el peor de los casos, debemos tener en cuenta los saltos de línea. Mientras que RFC 1421 define la longitud máxima de la línea como 64 caracteres, RFC 2045 (MIME) establece que habría 76 caracteres como máximo en una línea.

Esto último es lo que ha implementado la biblioteca C #. Entonces, en un entorno de Windows donde un salto de línea es de 2 caracteres (\ r \ n), obtenemos esto:Length = Floor(Ceiling(N/3) * 4 * 78 / 76)

Nota: El piso se debe a que durante mi prueba con C #, si la última línea termina exactamente en 76 caracteres, no se produce un salto de línea.

Puedo probarlo ejecutando el siguiente código:

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

La respuesta para 16 kBytes codificados en base64 con líneas de 76 caracteres: 22422 caracteres

Suponga que en Linux lo sería, Length = Floor(Ceiling(N/3) * 4 * 77 / 76)pero todavía no he podido probarlo en mi núcleo .NET.

Lionet Chen
fuente