如何计算 Base64 大小
- 保持选中 字节 → Base64 长度,输入 原始大小 并选择 单位。在 单位 下选择 1 KB = 1000 B 或 1 KiB = 1024 B,与你的大小的计量方式保持一致。
- 也可以把文件拖到框里。只读取它的大小,绝不会打开文件内容。
- 查看表格:带填充和不带填充的长度、百分比形式的额外开销、自定义换行(设置 行长度 和 换行符)、MIME 邮件行、PEM 正文、带文件 MIME 类型的
data:URI,以及带引号的 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%。对于很小的输入,填充占了大头:1 个字节变成 4 个字符,额外开销达到 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 |
换行只计算行与行之间的,最后一行后面没有。有些编码器(比如 Python 的 base64.encodebytes)会在包括最后一行在内的每一行末尾加 \n,这样会多一个换行。如果是 data URI,还要加上前缀:data:image/png;base64, 是 22 个字符。
围绕大小限制做规划
值得在出错之前检查的几种典型限制:
- 请求体大小限制。 如果某个接口接受 10,000,000 字节,而文件放在 JSON 字段里,那么文件最多约 7,500,000 字节,还要减去 JSON 的其余部分。切换到反向模式,输入限制值,再减去你的字段名即可。
- 数据库列和环境变量。
VARCHAR(255)最多能放 189 字节数据的 Base64;190 字节就已经需要 256 个字符。 - 电子邮件。 MIME 附件按 76 字符加 CRLF 换行,所以总共会增大约 37%。因此,邮件大小限制只能容纳约为其 73% 大小的文件。详情见 邮件中的 Base64。
- HTML 或 CSS 中的 data URI。 每张内联图片都比文件本身大三分之一,而且无法单独缓存。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("=") 就是解码后的大小。如果反向模式提示长度不可能成立,比如除以 4 余 1,说明字符串已损坏:用 Base64 校验工具 找出问题在哪里。
常见问题
Base64 长度的计算公式是什么?
带填充时,n 个字节对应 4 × ⌈n ÷ 3⌉ 个字符;不带填充时是 ⌈4n ÷ 3⌉。换行、data: 前缀或 JSON 引号另外再加。
从 Base64 解码后,文件有多大?
取 Base64 字符数(不含换行),乘以 3,除以 4,末尾每有一个 = 就再减一个字节。一个 1,400,000 字符的字符串,根据填充不同,解码后在 1,049,998 到 1,050,000 字节之间。
API 请求限制是 10 MB,最多能发送多大的文件?
如果限制是 10,000,000 字节,大约是 7.5 MB,因为 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 字段、数据库列或未压缩的请求,仍然要承担整整多出的三分之一。