Как рассчитать размер Base64
- Оставьте выбранным режим Байты → длина Base64, введите Исходный размер и выберите единицу в поле Единица. В поле Единицы укажите 1 KB = 1000 B или 1 KiB = 1024 B, смотря по тому, как измерялся ваш размер.
- Или перетащите файл в поле. Читается только его размер, содержимое файла не открывается.
- Посмотрите таблицу: длина с дополнением и без, накладные расходы в процентах, свой перенос строк (задайте Длина строки и Перенос строки), строки MIME для почты, тело PEM,
data:URI с MIME-типом файла и JSON-строка с кавычками. - Для обратного направления переключитесь на Длина Base64 → байты, введите длину, укажите, включает ли она переносы строк, а в поле Дополнение выберите вариант: известно, неизвестно (0–2 ×) или нет. Если вставить сам Base64, ответ будет точным.
Формула под таблицей повторяет расчёт с вашими числами, и её удобно вставить в комментарий в коде или в тикет.
Формула и откуда берутся 33%
Base64 превращает каждые 3 байта в 4 символа, каждый из которых несёт 6 бит. Последняя группа дополняется знаками = до полных 4 символов, поэтому:
padded = 4 × ⌈n ÷ 3⌉
unpadded = ⌈4n ÷ 3⌉
decoded = (characters × 3 ÷ 4) − number of "=" signs
Для больших данных это постоянный прирост в 33,3%. Для крошечных доминирует дополнение: один байт становится четырьмя символами, это 300% накладных расходов. Таблица ниже получена тем же кодом, который выполняет калькулятор:
| Исходно | Base64 с дополнением | Без дополнения | MIME (76 + CRLF) | PEM (64 + LF) |
|---|---|---|---|---|
| 1 байт | 4 | 2 | 4 | 4 |
| 100 байт | 136 | 134 | 138 | 138 |
| 1 000 байт (1 KB) | 1 336 | 1 334 | 1 370 | 1 356 |
| 1 024 байта (1 KiB) | 1 368 | 1 366 | 1 402 | 1 389 |
| 1 048 576 байт (1 MiB) | 1 398 104 | 1 398 102 | 1 434 896 | 1 419 949 |
| 5 000 000 байт (5 MB) | 6 666 668 | 6 666 667 | 6 842 106 | 6 770 834 |
Переносы считаются между строками, после последней строки переноса нет. Некоторые кодировщики, например base64.encodebytes в Python, завершают \n каждую строку, включая последнюю; это ещё один перенос. Для data URI добавьте префикс: data:image/png;base64, занимает 22 символа.
Как уложиться в лимиты размера
Калькулятор полезнее всего до того, как что-то сломалось. Несколько типичных вопросов:
- Лимиты на тело запроса. Если эндпоинт принимает 10 000 000 байт, а файл передаётся в поле JSON, файл может быть не больше примерно 7 500 000 байт минус остальной JSON. Переключитесь в обратный режим, введите лимит и вычтите имена своих полей.
- Колонки в базе данных и переменные окружения. В
VARCHAR(255)помещается Base64 максимум от 189 байт; для 190 байт нужно уже 256 символов. - Электронная почта. MIME-вложения переносятся на 76 символах с CRLF, так что в сумме растут примерно на 37%. Поэтому лимит на размер письма пропускает файлы размером лишь около 73% от него. Подробности в статье Base64 в электронной почте.
- Data URI в HTML и CSS. Каждая встроенная картинка весит на треть больше файла и не кешируется отдельно. Когда это всё же окупается, объясняет статья Data URI и производительность.
Длина Base64 в коде
В любом языке её можно посчитать, ничего не кодируя:
import math
def b64_len(n, padded=True):
return 4 * math.ceil(n / 3) if padded else math.ceil(4 * n / 3)
print(b64_len(1048576), b64_len(1048576, padded=False))
Код выводит 1398104 1398102. В JavaScript длину с дополнением даёт 4 * Math.ceil(n / 3). Чтобы проверить уже готовую строку, уберите переносы строк, и len(s) * 3 // 4 - s.count("=") даст размер после декодирования. Если обратный режим сообщает о невозможной длине, например с остатком 1 от деления на 4, строка повреждена: прогоните её через валидатор Base64, чтобы найти, где именно.
Вопросы и ответы
Какая формула длины Base64?
С дополнением это 4 × ⌈n ÷ 3⌉ символов для n байт. Без дополнения формула ⌈4n ÷ 3⌉. Переносы строк, префикс data: и кавычки JSON добавляются сверху.
Какой размер будет у файла после декодирования из Base64?
Возьмите число символов Base64 (без переносов строк), умножьте на 3, разделите на 4 и вычтите по байту за каждый = в конце. Строка из 1 400 000 символов декодируется в 1 049 998–1 050 000 байт в зависимости от дополнения.
Какой самый большой файл можно отправить через API с лимитом запроса 10 MB?
Примерно 7,5 MB, если лимит равен 10 000 000 байт: 10 000 000 × 3 ÷ 4 = 7 500 000, минус окружающие строку поля JSON и заголовки. Чтобы получить точную цифру, введите лимит как длину в обратном режиме.
Снимает ли gzip накладные расходы Base64?
При передаче по сети в основном да. Gzip сжимает Base64 примерно до размера закодированных байтов: 1 000 000 случайных байт дают 1 333 336 символов Base64, которые gzip сжимает до 1 009 976 байт. Но лимиты, которые считают сам текст (поле JSON, колонка в базе данных или несжатый запрос), по-прежнему видят всю лишнюю треть.