什么是Base64
Base64是一种基于64个可打印字符来表示二进制数据的编码方式。它常用于在文本协议中传输二进制数据,确保数据在传输过程中不被损坏。
Base64编码将二进制数据转换为由64个字符组成的文本格式,这些字符包括:A-Z, a-z, 0-9, +, /,以及填充字符=。
Base64广泛应用于电子邮件附件、网页图片嵌入、API数据传输等场景。它的核心思想是"用可打印字符表示不可打印的二进制数据"。
编码原理
Base64编码的核心原理是将3个字节(24位)的二进制数据转换为4个Base64字符。具体步骤如下:
- 将原始数据按3个字节一组进行分组
- 将每组3个字节(24位)重新划分为4个6位的单元
- 每个6位单元对应一个0-63的数值
- 根据Base64字符表将每个数值映射为对应的字符
- 如果最后一组不足3个字节,用等号(=)填充
以字符串 "Man" 为例,编码后的Base64结果为 "TWFu"。
Base64 的常见变体
标准 Base64:字符表为 A-Z、a-z、0-9、+、/,末尾用 = 填充。问题在于 + 和 / 在 URL 中是特殊字符,直接拼接会出错。
URL-Safe Base64(base64url):把 + 换成 -、/ 换成 _,常用于 URL 参数和令牌。JWT 的三段 payload 用的就是 base64url,这也是面试中最常被问到的变体。
| 变体 | 第 62/63 位字符 | 典型用途 |
|---|---|---|
| 标准 Base64 | + 和 / | 邮件附件、MIME |
| base64url | - 和 _ | JWT、URL 参数、文件名 |
| 去填充变体 | 省略末尾 = | 部分 JWT 实现、URL 场景 |
其他差异:MIME 规范要求每 76 个字符插入一个换行(CRLF),解析时要先去掉;Base32/Base16(即 Hex)是同族编码,体积更大但更保守。
应用场景
1. 电子邮件附件:电子邮件系统使用SMTP协议传输文本,二进制附件需要先编码为Base64文本格式,接收方再解码还原为原始文件。
2. JSON数据传输:在API接口中,二进制数据(如图片、文件)不能直接放入JSON中传输,通常编码为Base64字符串作为JSON字段的值。
3. HTTP基本认证:HTTP Basic Auth将用户名和密码拼接后使用Base64编码,放入请求头的Authorization字段中。
4. 网页图片嵌入:在HTML和CSS中,可以将小图片直接以Base64格式嵌入,减少HTTP请求次数,提升页面加载速度。
图片Base64编码
图片Base64编码是将图片文件转换为Base64字符串,可以直接嵌入到HTML或CSS中使用。格式如下:data:[mime-type];base64,[data]
例如:<img src="data:image/png;base64,iVBORw0KGgo...">
使用技巧与常见坑
1. Base64 是编码不是加密:它没有任何保密性,任何人都能无密钥解码。把密码"Base64 一下就安全了"是典型的错误认知,敏感数据请用加密(AES/RSA)。
2. JavaScript 处理中文的坑:原生 btoa() 只支持 Latin1 字符,直接传中文会报错。正确做法是先做 UTF-8 编码再 Base64:
3. 命令行快速编解码:排查接口问题时,终端一行命令比开网页更快:
4. 体积与性能权衡:编码后体积 +33%,大文件走 Base64 会拖慢解析与传输;HTTP/2 下小图标内联的收益也在下降,建议结合构建工具按 4KB 阈值自动取舍。
本站的 Base64 编码解码工具支持 UTF-8 中文与图片转 Base64,可以在线验证上面这些用法。