La respuesta de geocar estuvo cerca, pero a veces podría estar un poco desajustada.
Hay 4 bytes de salida por cada 3 bytes de entrada. Si el tamaño de entrada no es un múltiplo de tres, debemos agregarlo para hacerlo uno. De lo contrario, déjalo en paz.
input_size + ((input_size % 3) ? (3 - (input_size % 3)) : 0)
Dividir esta por 3, luego se multiplica por 4. Es decir nuestro tamaño total de la producción, incluyendo las protecciones.
code_padded_size = ((input_size + ((input_size % 3) ? (3 - (input_size % 3)) : 0))/3) * 4
Como dije en mi comentario, el tamaño total debe ser dividido por el ancho de la línea antes de doblar a explicar correctamente la última línea.De lo contrario, se sobreestimará el número de caracteres CRLF. También estoy suponiendo que solo habrá un par CRLF si la línea tiene 72 caracteres. Esto incluye la última línea, pero no si tiene menos de 72 caracteres.
newline_size = ((code_padded_size)/72) * 2
Así que ponerlo todo junto:
unsigned int code_padded_size = ((input_size + ((input_size % 3) ? (3 - (input_size % 3)) : 0))/3) * 4;
unsigned int newline_size = ((code_padded_size)/72) * 2;
unsigned int total_size = code_padded_size + newline_size;
O para que sea un poco más fácil de leer:
unsigned int adjustment = ((input_size % 3) ? (3 - (input_size % 3)) : 0);
unsigned int code_padded_size = ((input_size + adjustment)/3) * 4;
unsigned int newline_size = ((code_padded_size)/72) * 2;
unsigned int total_size = code_padded_size + newline_size;
Los caracteres CRLF por 72 no están codificados en Base 64 en bruto; es solo una variante común. –
Si pongo énfasis en "y" en "y lo rompes con ...", ¿eso lo dejaría más claro? – geocar
Este cálculo de CRLF debe ser: crlfs_size = 2 + (2 * ((code_size + padding_size)/72)); El tamaño total se debe dividir por el ancho de línea antes de doblar para representar correctamente la última línea. De lo contrario, se sobreestimará el número de caracteres CRLF. Además, el 2 + puede no ser necesario si no hay un par CRLF final. – adzm