在线工具箱 · 最后更新:2026 年 7 月
Base64 是一种基于 64 个可打印 ASCII 字符来表示二进制数据的编码方法。它的核心思想并不复杂:计算机中存储的所有数据本质上都是 0 和 1 组成的二进制流,但很多文本协议(如电子邮件、HTTP 请求、JSON 配置文件)只接受可打印的 ASCII 字符。Base64 的作用就是将二进制数据"翻译"成纯文本形式,使之能够在这些纯文本环境中安全传输。
之所以叫 "Base64",是因为这套编码方案使用了一个由 64 个字符组成的固定字符集:大写字母 A 到 Z(26 个)、小写字母 a 到 z(26 个)、数字 0 到 9(10 个),以及加号 + 和斜杠 /(2 个),恰好凑齐 64 个。另外还有一个等号 = 用作填充符。
在体积方面,Base64 编码会将原始数据按每 3 个字节一组进行拆分,然后将其转换为 4 个 Base64 字符。由于 3 字节(24 位)的数据被映射为 4 个字符(每个字符代表 6 位信息),编码后的数据量会变为原来的 4/3,也就是体积增大约 33%。这是 Base64 编码的固有开销,在任何实现中都无法避免。
理解 Base64 的编码过程,关键在于理解"位"的重新分组。计算机中每个字节由 8 个二进制位组成,3 个字节就是 24 个二进制位。Base64 编码将这 24 个位均匀地分成 4 组,每组 6 个位。因为 2 的 6 次方 = 64,所以 6 位二进制数恰好可以用 64 个字符中的某一个来表示。这就是为什么 Base64 的字符集刚好是 64 个。
我们用一个具体例子来演示。假设要编码的原始文本是三个 ASCII 字符 Man,它们对应的 ASCII 值分别是 77(M)、97(a)、110(n),转换为二进制如下:
M -> 01001101
a -> 01100001
n -> 01101110
将这 24 位连成一串:010011010110000101101110,然后每 6 位一组进行切分:
010011 | 010110 | 000101 | 101110
将每组 6 位二进制转换为十进制值,再查 Base64 字符表得到对应的字符:
010011 = 19 -> T
010110 = 22 -> W
000101 = 5 -> F
101110 = 46 -> u
所以 Man 经 Base64 编码后的结果是 TWFu。如果原始数据的字节数不是 3 的整数倍,比如只有 1 个字节或 2 个字节,剩下的位会用 0 补齐,并在编码结果末尾加上 1 个或 2 个等号 = 作为填充符,以标示原始数据长度。
完整的 Base64 字符索引表如下。索引值 0-25 对应大写字母 A-Z,26-51 对应小写字母 a-z,52-61 对应数字 0-9,62 对应 +,63 对应 /:
| 索引 | 字符 | 索引 | 字符 | 索引 | 字符 | 索引 | 字符 |
|---|---|---|---|---|---|---|---|
| 0 | A | 16 | Q | 32 | g | 48 | w |
| 1 | B | 17 | R | 33 | h | 49 | x |
| 2 | C | 18 | S | 34 | i | 50 | y |
| 3 | D | 19 | T | 35 | j | 51 | z |
| 4 | E | 20 | U | 36 | k | 52 | 0 |
| 5 | F | 21 | V | 37 | l | 53 | 1 |
| 6 | G | 22 | W | 38 | m | 54 | 2 |
| 7 | H | 23 | X | 39 | n | 55 | 3 |
| 8 | I | 24 | Y | 40 | o | 56 | 4 |
| 9 | J | 25 | Z | 41 | p | 57 | 5 |
| 10 | K | 26 | a | 42 | q | 58 | 6 |
| 11 | L | 27 | b | 43 | r | 59 | 7 |
| 12 | M | 28 | c | 44 | s | 60 | 8 |
| 13 | N | 29 | d | 45 | t | 61 | 9 |
| 14 | O | 30 | e | 46 | u | 62 | + |
| 15 | P | 31 | f | 47 | v | 63 | / |
当原始数据的字节数不是 3 的倍数时,不足的部分会补零,对应的输出位置用填充符 = 代替。例如原始数据只有 1 个字节时产生 2 个 =,2 个字节时产生 1 个 =,恰好 3 个字节时则不需要填充符。
Base64 编码在软件开发和互联网协议中有大量实际应用,以下是几个最常见的场景:
在 HTML 或 CSS 中,可以通过 Base64 将小图片直接编码为文本字符串并内嵌到页面中,从而减少 HTTP 请求的数量。这种方式特别适用于小尺寸的图标、logo 和装饰性图片。
<img src="data:image/png;base64,iVBORw0KGgo..." alt="icon">
HTTP Basic Authentication 协议要求将用户名和密码拼接后进行 Base64 编码,然后放在请求头的 Authorization 字段中发送。例如用户名 admin、密码 123456 拼接为 admin:123456,编码后为 YWRtaW46MTIzNDU2。
Authorization: Basic YWRtaW46MTIzNDU2
JSON Web Token(JWT)是一种广泛使用的身份验证令牌格式。JWT 由三部分组成:Header、Payload 和 Signature,每部分之间用点号 . 分隔,其中 Header 和 Payload 都是经过 Base64URL 编码的 JSON 字符串。你可以用本文中的工具解码 JWT 的前两段来查看其内容。
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKx
电子邮件协议 SMTP 最初只支持传输纯 ASCII 文本,无法直接携带二进制附件。MIME 标准引入了 Base64 编码,将图片、文档等二进制文件转换为纯文本后嵌入邮件正文。你在邮件源码中看到的 Content-Transfer-Encoding: base64 就是这个原理。
在 Kubernetes、Docker 以及各类云服务的配置文件中,经常需要将证书、密钥等二进制数据以 Base64 字符串的形式写入 YAML 或 JSON 配置。例如 Kubernetes Secret 对象中的 value 字段就要求使用 Base64 编码。
标准 Base64 字符集中包含 + 和 / 这两个字符。然而在 URL 和文件名场景中,+ 会被解析为空格,/ 会被解析为路径分隔符,而 = 在 URL 参数中也可能引起歧义。为了解决这个问题,RFC 4648 定义了 Base64 的 URL 安全变体(Base64URL)。
Base64URL 的改动非常简单,只有三处替换:
+ 替换为 -(减号)/ 替换为 _(下划线)= 通常被省略(具体实现可选是否保留)JWT Token 中使用的就是 Base64URL 编码而非标准 Base64 编码。如果你需要解码 JWT,可能需要先将 - 替换回 +,将 _ 替换回 /,再根据需要补齐填充符,然后才能正确解码。
除了 Base64,常见的二进制数据编码方式还有 Hex 编码、URL 编码和 Base32。它们各有特点,适用场景也不同:
| 编码方式 | 字符集 | 体积膨胀率 | 典型用途 |
|---|---|---|---|
| Base64 | A-Z, a-z, 0-9, +, / | 约 33% | 邮件附件、JWT、Data URI、配置文件 |
| Hex(十六进制) | 0-9, A-F | 100%(翻倍) | 调试输出、哈希值显示、颜色代码 |
| URL 编码 | ASCII 可打印字符 + %XX | 不确定 | URL 参数转义、表单提交 |
| Base32 | A-Z, 2-7 | 约 60% | 不区分大小写的环境、TOTP 验证码 |
Hex 编码(十六进制编码)最为直观,每个字节对应两个十六进制字符,但代价是体积翻倍,通常只用于人类可读的调试场景或短数据。URL 编码主要解决 URL 中的保留字符转义问题,体积膨胀不固定。Base32 使用纯大写字母和有限数字,在不区分大小写的场景(如语音播报)中有优势,但体积膨胀更大。综合来看,Base64 在效率和通用性之间取得了最好的平衡,因此应用最为广泛。
等号 = 是 Base64 的填充符。Base64 编码每次处理 3 个字节(24 位),将其映射为 4 个字符。当原始数据的字节数不是 3 的倍数时,最后不足 3 字节的部分需要补零凑齐 24 位,然后多出来的输出字符用 = 替换。如果原始数据只余 1 字节,末尾补两个 =;余 2 字节则补一个 =;恰好是 3 的倍数时不需要填充符。解码器通过末尾 = 的数量来推断原始数据的真实长度,从而正确还原数据。
不可以。Base64 只是一种编码方式,不是加密算法。任何人只要知道数据经过了 Base64 编码,就可以直接将其解码还原。Base64 的目的是让二进制数据能在纯文本环境中传输,而非保护数据安全。如果需要保护数据,应当使用 AES、RSA 等真正的加密算法。有些初学者会将混淆和加密混为一谈,认为经过 Base64 处理后数据就"安全"了,这是一个常见的误解。
这是因为在进行 Base64 编码之前,中文字符首先会被转换为 UTF-8 字节序列,而每个中文字符在 UTF-8 中通常占 3 个字节。以"你好"两个字为例,它们对应的 UTF-8 字节共有 6 个,经 Base64 编码后变成 8 个字符。而同样含义的两个英文字符 "Hi" 只有 2 个字节,编码后只有 4 个字符。所以中文字符的 Base64 编码结果看起来比英文长得多,其根本原因是 UTF-8 编码下中文字符本身就占用更多字节。
使用上方的在线 Base64 编解码工具非常简单:
所有编解码操作均在浏览器本地完成,您的输入数据不会被发送到任何远程服务器。本工具采用 UTF-8 编码处理,能够正确支持包含中文、日文、韩文、Emoji 等多字节 Unicode 字符的 Base64 编码与解码。