Skip to content
返回博客
教程

什么是 Base64 编码?新手入门指南

Base64 入门:了解 Base64 编码是什么、工作原理、使用场景以及开发中常见的注意事项,适合初学者的图文详解。

8 分钟

理解 Base64 编码

刚接触 Base64?你来对地方了。 这篇新手友好的指南将解释 Base64 是什么、它的工作原理,以及作为开发者你会在哪些场景中遇到它。如果你想了解 MIME 编码、Data URL、性能优化和安全注意事项等进阶主题,请参阅我们的 Base64 进阶完全指南

Base64 编码是现代软件开发中广泛使用的基础技术。无论是在 HTML 中嵌入图片、通过文本协议传输二进制数据,还是与 API 交互,理解 Base64 都是必不可少的。

什么是 Base64?

Base64 是一种将二进制数据转换为 ASCII 字符串格式的编码方案。它使用 64 个字符(A-Z、a-z、0-9、+、/)来表示数据,并使用 = 作为填充字符。

“Base64”这个名字源于它使用了恰好 64 个可打印的 ASCII 字符作为编码字母表。该方案起源于电子邮件的早期时代——当时 MIME(多用途互联网邮件扩展)标准需要一种可靠的方式,将图片、文档等二进制文件附加到只能处理 7 位 ASCII 文本的邮件消息中。Base64 在 RFC 4648 中被正式定义,其前身可追溯到 1980 年代末的 PEM(Privacy Enhanced Mail)规范。此后,它成为了计算领域中应用最广泛的编码方法之一。

为什么要使用 Base64?

  1. 数据传输:许多协议只支持文本数据。Base64 允许二进制内容安全地传输。
  2. Data URI:使用 Data URI 将小型图片或文件直接嵌入 HTML/CSS 中。
  3. API 载荷:在 JSON 载荷中发送二进制数据,避免编码问题。
  4. 邮件附件:MIME 编码使用 Base64 来处理附件。

为了更直观地理解,以下是 Base64 在日常开发中的具体使用场景:

  • 邮件附件(MIME):当你在邮件中添加 PDF 或图片附件时,邮件客户端会将文件 Base64 编码后作为文本块嵌入邮件正文。收件方的客户端再将其解码还原为原始文件。
  • 在 HTML/CSS 中嵌入图片:你可以将图片内联为 data URL,而不是链接到外部文件:<img src="data:image/png;base64,iVBOR...">。这样可以减少一次 HTTP 请求,对小图标和精灵图特别有用。
  • 在 JSON/XML 中存储二进制数据:JSON 和 XML 是文本格式,无法原生表示原始字节。Base64 可以让你将二进制内容(如缩略图、加密密钥或证书)作为普通字符串字段存储。
  • HTTP Basic 认证Authorization 请求头将凭据编码为 Basic base64(用户名:密码) 的格式。例如,user:pass 会变成 Basic dXNlcjpwYXNz。注意这只是编码而非加密——务必配合 HTTPS 使用。

Base64 的工作原理

Base64 编码的原理是将每 3 个字节(24 位)的二进制数据转换为 4 个字符(每个 6 位):

原始数据:  01001101 01100001 01101110  (3 字节 = "Man")
拆分:      010011 010110 000101 101110  (4 组 6 位数据)
Base64:    T      W      F      u       (4 个字符)

逐步示例:编码 “Hi”

让我们通过编码短字符串 “Hi” 来看看每个步骤具体发生了什么:

1. 获取 ASCII 值:

  • H = 72,i = 105

2. 转换为 8 位二进制:

  • H = 01001000,i = 01101001

3. 拼接所有比特位:

  • 01001000 01101001(共 16 位)

4. 按 6 位一组拆分(末尾补零以填满最后一组):

  • 010010 000110 100100
  • 原始的 16 位需要 3 组共 18 位,因此末尾补了 2 个零。

5. 将每个 6 位值映射到 Base64 字母表:

  • 010010 = 18 → S
  • 000110 = 6 → G
  • 100100 = 36 → k

6. 添加填充: 输入为 2 个字节(不是 3 的倍数),因此添加一个 =

结果:SGk=

填充规则很简单:如果输入长度除以 3 余 1,添加 ==;余 2 则添加 =;整除则不需要填充。

常见注意事项

体积增加

Base64 会使数据体积增加约 33%。例如,一个 1MB 的图片经过 Base64 编码后会变成约 1.37MB(具体开销取决于换行符和填充)。对于小型资源如图标,这几乎可以忽略不计,但对于大文件来说,膨胀会迅速累积——一个 10MB 的视频编码后将超过 13MB。使用前请权衡内联嵌入的便利性与体积增加的代价。

不是加密

Base64 是编码,不是加密。它不提供任何安全保护,任何人都可以瞬间还原——在 JavaScript 中,atob('SGVsbG8=') 就能返回 "Hello"。切勿用 Base64 来隐藏密码、令牌或敏感数据。如果需要保密性,请使用真正的加密算法(如 AES、RSA 等)。

URL 安全性

标准 Base64 使用的 +/ 在 URL 和查询字符串中具有特殊含义。例如,标准 Base64 中的 data+test/value 会破坏 URL 参数。URL 安全的 Base64 将 + 替换为 -/ 替换为 _,生成类似 data-test_value 的字符串,可以安全地用在 URL 中而无需百分号编码。大多数编程语言都提供了 URL 安全的变体——只要 Base64 输出会出现在 URL 中,就应该使用它。

不同编程语言中的 Base64

大多数编程语言都内置了 Base64 支持。以下是两个常见示例:

// JavaScript(浏览器和 Node.js)
btoa('Hello')     // "SGVsbG8="
atob('SGVsbG8=')  // "Hello"
# Python
import base64
base64.b64encode(b'Hello').decode()   # 'SGVsbG8='
base64.b64decode('SGVsbG8=').decode()  # 'Hello'
// Go
package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    encoded := base64.StdEncoding.EncodeToString([]byte("Hello"))
    fmt.Println(encoded) // "SGVsbG8="

    decoded, _ := base64.StdEncoding.DecodeString("SGVsbG8=")
    fmt.Println(string(decoded)) // "Hello"

    // URL-safe variant
    urlEncoded := base64.URLEncoding.EncodeToString([]byte("Hello?World"))
    fmt.Println(urlEncoded) // "SGVsbG8/V29ybGQ="
}

在 JavaScript 中,btoa()(binary-to-ASCII)用于编码,atob()(ASCII-to-binary)用于解码。注意 btoa() 只能处理 Latin-1 字符;对于 Unicode 字符串,需要先编码为 UTF-8。Python 的 base64 模块操作的是 bytes 对象,因此需要先用 b'...'.encode() 将字符串转为字节。Go 的 encoding/base64 包同时提供 StdEncodingURLEncoding,让你可以方便地选择适合场景的变体。其他语言——Java、C#、Ruby、PHP——都在标准库中提供了类似的简洁 API。

使用我们的 Base64 工具

我们的 Base64 编码/解码工具 可以方便地:

  • 将文本或文件编码为 Base64
  • 解码 Base64 字符串
  • 生成用于网页嵌入的 Data URI
  • 处理 URL 安全的编码变体

总结

Base64 是每个开发者都应该了解的通用编码方案。当你需要通过纯文本通道传输二进制数据时可以使用它,但请记住,它不是安全措施,而且会增加数据体积。


想要深入了解? 阅读我们的 Base64 高级指南:从 MIME 到 Data URL 的实战详解,了解 JavaScript 和 Python 实现、性能优化技巧以及安全注意事项。