Base64 编解码详解

深入了解Base64编码的原理、使用场景和各语言实现。包含JavaScript、Python、Java等Base64编解码代码示例。

编码转换 2026-05-27 9 分钟

Base64 编解码详解

Base64 是一种基于64个可打印字符来表示二进制数据的编码方式。它在Web开发、数据传输、邮件系统等领域有着广泛的应用。本文将深入介绍 Base64 的原理、使用场景和最佳实践。

什么是 Base64?

Base64 编码将二进制数据转换为由 A-Za-z0-9+/ 这64个字符组成的文本字符串(= 用作填充符)。

编码过程示例:

原始文本: Hello
ASCII:    72 101 108 108 111
二进制:   01001000 01100101 01101100 01101100 01101111
6位分组:  010010 000110 010101 101100 011011 000110 1111(00)
Base64:   S      G      V      s      b      G      8      =
结果:     SGVsbG8=

每3个字节(24位)被分为4组(每组6位),每组映射到 Base64 字符表中的一个字符。

Base64 字符表

索引 字符 索引 字符 索引 字符 索引 字符
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 /

为什么需要 Base64?

1. 文本协议传输二进制数据

HTTP、SMTP 等协议设计为传输文本数据。当需要传输图片、文件等二进制数据时,Base64 编码将其转换为安全的文本格式。

2. 数据嵌入

在 HTML 或 CSS 中可以直接嵌入 Base64 编码的图片(Data URI),减少 HTTP 请求:

.logo {
  background-image: url('data:image/png;base64,iVBORw0KGgo...');
}
<img src="data:image/png;base64,iVBORw0KGgo..." alt="logo">

3. 简单的数据编码

用于需要避免特殊字符的场景,如 URL 参数、Cookie 值、XML/JSON 中的二进制数据。

各语言实现

JavaScript

// 编码
const encoded = btoa('Hello World')  // SGVsbG8gV29ybGQ=
const encodedUTF8 = btoa(unescape(encodeURIComponent('你好')))

// 解码
const decoded = atob('SGVsbG8gV29ybGQ=')  // Hello World
const decodedUTF8 = decodeURIComponent(escape(atob(encodedUTF8)))

Python

import base64

# 编码
encoded = base64.b64encode(b'Hello World').decode('utf-8')
# 输出: SGVsbG8gV29ybGQ=

# 解码
decoded = base64.b64decode(encoded).decode('utf-8')
# 输出: Hello World

# 中文编码
encoded = base64.b64encode('你好'.encode('utf-8')).decode('utf-8')
decoded = base64.b64decode(encoded).decode('utf-8')

Java

import java.util.Base64;

// 编码
String encoded = Base64.getEncoder().encodeToString("Hello World".getBytes());
String urlSafe = Base64.getUrlEncoder().encodeToString(data);

// 解码
byte[] decoded = Base64.getDecoder().decode(encoded);
String result = new String(decoded);

Go

import "encoding/base64"

// 编码
encoded := base64.StdEncoding.EncodeToString([]byte("Hello World"))

// 解码
decoded, err := base64.StdEncoding.DecodeString(encoded)

常见应用场景

1. 图片转 Base64

将图片文件转换为 Base64 字符串,用于嵌入 HTML 或通过 API 传输:

// 浏览器中将文件转为 Base64
function fileToBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.onload = () => resolve(reader.result)
    reader.onerror = reject
    reader.readAsDataURL(file)
  })
}

2. HTTP Basic Authentication

const credentials = btoa('username:password')
fetch('/api/data', {
  headers: {
    'Authorization': `Basic ${credentials}`
  }
})

3. JWT Token 解码

JWT Token 的 payload 部分是 Base64Url 编码的:

function decodeJWT(token) {
  const payload = token.split('.')[1]
  return JSON.parse(atob(payload))
}

4. 邮件附件

MIME 邮件协议使用 Base64 编码附件:

Content-Transfer-Encoding: base64
Content-Type: application/pdf

JVBERi0xLjQKMSAwIG9iago8PA...

Base64 变体

URL Safe Base64

标准 Base64 中的 +/ 在 URL 中有特殊含义,URL Safe 版本将其替换为 -_

// 标准 Base64: a+b/c=
// URL Safe:    a-b_c=

Base64URL(RFC 4648)

与 URL Safe Base64 类似,但去掉了填充字符 =

// 标准: SGVsbG8gV29ybGQ=
// Base64URL: SGVsbG8gV29ybGQ

注意事项

1. Base64 不是加密

Base64 只是编码方式,不是加密算法。任何人都可以轻松解码 Base64 数据。不要用 Base64 来保护敏感信息。

2. 体积增加

Base64 编码后数据体积增加约 33%(每3字节变为4字符)。在传输大量数据时需要考虑这个开销。

3. 中文编码

处理中文时需要特别注意字符编码。JavaScript 的 btoa() 只支持 ASCII 字符,处理中文需要先进行 UTF-8 编码。

4. 换行符

某些 Base64 实现会在每76个字符后插入换行符(MIME 标准)。解码时需要注意处理。

常见问题

Q: Base64 编码后为什么会多出 =

A: = 是填充字符。Base64 将每3个字节编码为4个字符,如果原始数据不是3的倍数,就会用 = 补齐。1个 = 表示差1个字节,2个 = 表示差2个字节。

Q: 如何判断一个字符串是否是 Base64?

A: 可以检查字符串是否只包含 A-Za-z0-9+/= 字符,且长度是4的倍数。但最可靠的方法是尝试解码看是否成功。

Q: Base64 和 Base64Url 有什么区别?

A: Base64Url 用 - 替换 +,用 _ 替换 /,并且通常去掉末尾的 =。这使得编码结果可以安全地用在 URL 中。

Q: 浏览器中如何处理大文件的 Base64 编码?

A: 对于大文件,建议使用 FileReader API 分块读取,或者使用 Web Workers 避免阻塞主线程。超过几MB的文件不建议转为 Base64 嵌入 HTML。

总结

Base64 是开发中常用的编码方式,理解其原理和使用场景对日常开发非常有帮助。推荐使用 jsjson.com 在线 Base64 编解码工具,支持文本和图片的 Base64 编解码,纯前端处理保障数据安全。配合 URL编解码工具Hex编解码工具 使用,可以覆盖所有常见的编码转换需求。


本文最后更新于 2026 年 5 月

📚 相关文章