La risposta di geocar era vicina, ma a volte poteva essere leggermente ridotta.
Ci sono 4 byte in uscita per ogni 3 byte di input. Se la dimensione di input non è un multiplo di tre, dobbiamo aggiungere per renderla una. Altrimenti lascia stare.
input_size + ((input_size % 3) ? (3 - (input_size % 3)) : 0)
dividere questo da 3, poi moltiplicare per 4. Questa è la nostra dimensione totale in uscita, o imbottitura.
code_padded_size = ((input_size + ((input_size % 3) ? (3 - (input_size % 3)) : 0))/3) * 4
Come ho detto nel mio commento, la dimensione totale deve essere diviso per la larghezza della linea prima del raddoppio di spiegare correttamente per l'ultima riga.Altrimenti il numero di caratteri CRLF sarà sovrastimato. Suppongo anche che ci sarà solo una coppia CRLF se la linea è di 72 caratteri. Questo include l'ultima riga, ma non se è inferiore a 72 caratteri.
newline_size = ((code_padded_size)/72) * 2
Così si può mettere tutto insieme:
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 per renderlo un po 'più leggibile:
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;
I caratteri CRLF-per-72 non sono codificati in Base 64; è solo una variante comune. –
Se metto l'accento su "e" su "e lo interrompi con ...", questo lo renderebbe più chiaro? – geocar
Questo calcolo CRLF dovrebbe essere: crlfs_size = 2 + (2 * ((code_size + padding_size)/72)); La dimensione totale deve essere divisa per la larghezza della linea prima del raddoppio per rappresentare correttamente l'ultima riga. Altrimenti il numero di caratteri CRLF sarà sovrastimato. Anche il 2 + potrebbe non essere necessario se non c'è una coppia CRLF finale. – adzm