Base64 编码/解码

文本与 Base64 互转,支持中文和 emoji

Base64 完全指南:编码规则、填充、体积开销与常见误区

Base64 到底做了什么

Base64 把任意二进制数据重新映射到 64 个可打印字符上:A-Z、a-z、0-9,加上 + 和 /。映射是每 3 个字节(24 位)切成 4 组 6 位,每组查表得到一个字符,所以输出长度总是输入长度的 4/3。

它存在的原因不是"加密",而是为了穿过那些只允许文本的通道。SMTP 邮件、HTTP 头、JSON 字符串、XML 文本节点、URL 查询参数——这些地方一旦出现不可打印字节就会被截断或改写。Base64 把任意字节变成这些通道能安全承载的字符集。

填充符 = 是怎么来的

输入长度不一定是 3 的整数倍,这时最后一块会缺字节,编码器用 = 补齐到 4 个字符:

输入字节数输出字符数填充例子
14== 两个"a" → YQ==
24= 一个"ab" → YWI=
34无"abc" → YWJj

填充符只表示"原始数据到这里结束",不含任何信息。所以有些场景会把它去掉以省体积——但去掉后长度不再能被 4 整除,解码器必须自己补回来。Base64 的填充是可选的,但解码器处理必须正确,否则会得到最后一个字节错误的输出。

体积开销:不是"差不多",是实打实涨 33%

4/3 意味着 体积增加约 33.3%。一张 300 KB 的图片转成 Base64 字符串会变成约 400 KB。再叠加几层(比如把 Base64 塞进 JSON 再塞进另一层 Base64),膨胀会累积。

这带来几个真实的坑:

URL-safe 变体:为什么要换掉 + 和 /

标准 Base64 的字母表含 + 和 /,这两个字符在 URL 里有特殊含义(空格与路径分隔),直接放进 URL 会被再编码或截断。RFC 4648 第 5 节定义了 URL-safe 变体:

变体字母表差异填充典型用途
标准 Base64+ /保留邮件附件、data URI
Base64url- _通常去掉JWT、URL、文件名
MIME Base64标准字母表保留邮件正文按 76 字符换行

注意:Base64 和 Base64url 的编码结果不同,不能互解。把 JWT 里的 - _ 原样丢给一个只认标准字母表的解码器,会得到乱码。这个工具两种都支持。

Base64 不是加密,也不是哈希

这三个概念经常被混在一起,但性质完全不同:

可逆需要密钥目的
Base64 编码可逆不需要让数据能安全穿过文本通道
加密(AES 等)可逆需要保密
哈希(SHA-256 等)不可逆不需要校验完整性

任何人都能还原 Base64。把密码、API Key、身份证号做 Base64 之后再传输,等同于明文传输。浏览器里 F12 打开控制台,一行 atob() 就还原了。真要保密,用 TLS 传,或者用带认证的加密方案(AES-GCM 这类)。

常见错误清单

什么时候该用它,什么时候不该

该用:把二进制塞进文本协议(JWT、邮件、XML、JSON)、把图标内联进 CSS、在日志里安全记录二进制片段、构造 Basic Auth 头。

不该用:传输敏感数据(用 TLS)、存储密码(用 bcrypt/argon2)、大文件在 HTTP 里搬运(用 multipart 或直接二进制传输,省 33% 带宽)、需要压缩的场景(先压缩再 Base64,顺序反了就没效果)。

本工具全程在浏览器本地运行,不发送任何数据。要处理大文件时,可以先在开发者工具的 Network 面板确认没有对外请求。

常见问题

为什么解码出来是乱码?

输入的内容可能不是 Base64,或它编码的是图片等二进制数据。本站解码结果是按 UTF-8 文本还原的,二进制内容显示为乱码属于正常现象。

数据会上传到服务器吗?

不会。编码解码全部在当前浏览器页面内完成,没有网络请求。

支持中文和 emoji 吗?

支持。工具会先转成 UTF-8 字节再做 Base64,中文、emoji 都能正确往返。