Base64 解决什么问题?
早期的互联网协议(如电子邮件 SMTP)只能传输 ASCII 文本字符。二进制数据(图片、附件、中文)直接传输会被截断或损坏。Base64 的作用就是:把任意二进制数据转换成 64 个可打印 ASCII 字符(A-Z、a-z、0-9、+、/),确保数据在纯文本协议中安全传输。
必须强调:Base64 是编码不是加密。任何人拿到 Base64 字符串都能瞬间解码还原,它不提供任何安全性。把密码 Base64 后存储等于明文存储。
编码原理:3 字节变 4 字符
Base64 的算法非常优雅:每 3 个字节(24 位)切成 4 组,每组 6 位。6 位能表示 64 个值(2^6=64),正好对应 64 个字符表中的一个字符。所以「Man」编码为「TWFu」:M(77)=01001101,a(97)=01100001,n(110)=01101110,拼接后重新分组即可。
代价是体积膨胀 33%(3 字节变 4 字符)。这就是为什么大文件不适合 Base64 内嵌——1MB 的图片编码后变成 1.33MB 的文本。
常见应用场景
Data URL:把图片直接嵌入 HTML/CSS,data:image/png;base64,...,减少 HTTP 请求,适合小图标(<10KB)。JWT Token:JSON Web Token 的 header 和 payload 部分就是 Base64URL 编码。
HTTP Basic 认证:Authorization: Basic 后面跟的就是「用户名:密码」的 Base64 编码(再次说明它不加密)。邮件附件:MIME 协议中附件默认 Base64 编码传输。
在线 Base64 编解码
日常调试接口、解析 JWT、查看编码内容时,在线工具是最快的选择。支持文本与 Base64 双向转换、中文 UTF-8 正确处理、URL-safe 变体,全部浏览器本地运行。
Base64 的变体与注意事项
Base64URL:把 + 换成 -,/ 换成 _,去掉结尾的 = 填充,用于 URL 和文件名(标准 Base64 的 +/= 在 URL 中有特殊含义)。JWT 使用的就是这种变体。
中文编码问题:Base64 处理的是字节流,中文必须先按 UTF-8 转为字节再编码。JavaScript 中直接 btoa('中文') 会报错,需要先 encodeURIComponent 或使用 TextEncoder。这也是许多在线工具解码中文出现乱码的原因。