ответ геокаря был близок, но иногда мог быть немного не верным.
На каждые 3 байта ввода выводится 4 байта. Если входной размер не кратен трем, мы должны добавить, чтобы он был один. В противном случае оставьте это в покое.
input_size + ( (input_size % 3) ? (3 - (input_size % 3)) : 0)
Разделите это на 3, затем умножьте на 4. Это наш общий размер вывода, включая отступы.
code_padded_size = ((input_size + ( (input_size % 3) ? (3 - (input_size % 3)) : 0) ) / 3) * 4
Как я уже сказал в своем комментарии, общий размер должен быть разделен на ширину линии перед удвоением, чтобы правильно учесть последнюю строку. В противном случае количество символов CRLF будет завышено. Я также предполагаю, что будет только пара CRLF, если строка будет состоять из 72 символов. Это включает в себя последнюю строку, но не если она меньше 72 символов.
newline_size = ((code_padded_size) / 72) * 2
Итак, соберите все вместе:
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;
Или сделать его немного более читабельным:
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;