基础概念2026-11-01

Base64 是什么?为什么图片会变成一串字符

一句话结论:Base64 是把任意二进制数据转换成 64 个可打印字符的编码方式,不是加密,任何人都能解码;代价是体积增加约 33%。

为什么需要它

很多传输协议只接受「可打印字符」:邮件正文、URL、XML、JSON 里的字符串字段。图片、压缩包、证书这些二进制内容直接塞进去会破坏格式,于是需要一层「二进制 → 文本」的转换。

Base64 的做法很简单:每 3 个字节(24 位)拆成 4 组 6 位,每组映射到下面这张字符表:

A-Z a-z 0-9 + /

共 64 个字符,所以叫 Base64。剩下的填充用 = 补齐,保证输出长度是 4 的倍数。

举个例子,字符串 Man 的 ASCII 字节是 4D 61 6E,编码后是 TWFu。解码就是反过来做。

体积为什么会变大

3 个字节变成 4 个字符,体积变成原来的 4/3 ≈ 133%。一张 300 KB 的图片转成 Base64 大约 400 KB——所以小图标内联进 CSS 划算(省一次请求),大图内联反而拖慢加载。

它不是加密

这是最常见的误解。Base64 没有密钥、没有数学难题,任何工具一秒就能还原。把密码或密钥做 Base64 再传输,等于没加密,正确做法是用 AES 或 HTTPS。

两个常见坑

1. 中文编码不一致导致「乱码」

Base64 编码的是字节,不是字符。同一个「中」字:

编码 字节 Base64
UTF-8 E4 B8 AD 5Lit
GBK D6 D0 1tA=

两边如果约定不一致,解出来就是乱码。跨系统传输时明确约定 UTF-8 最稳妥。

2. URL 里的 + 和 /

标准 Base64 的字符表包含 + 和 /,放进 URL 会被当成特殊字符。于是有了 URL 安全变体:把 + 换成 -、/ 换成 _,并去掉末尾的 =。JWT 用的就是这种变体。

什么时候该用

  • 小图片、字体内联到 CSS 或 JSON
  • 邮件附件(MIME 标准)
  • 需要在纯文本协议里传二进制
  • Data URL:data:image/png;base64,...

什么时候不该用:大文件、需要保密的内容、已经有二进制传输通道的场景。

常见问题

Base64 能加密吗?

不能。Base64 是编码不是加密,任何人都能解码,需要保密请用 AES 等加密算法。

为什么中文 Base64 和别人不一样?

Base64 编码的是字节。中文在 UTF-8 和 GBK 下的字节不同,编码结果自然不同。

Base64 会让文件变大多少?

约增加 33%,因为每 3 个字节会变成 4 个字符,末尾还会补 =。

用工具试试