Base64 Files
基础指南

Base64 是什么?

Base64 是一种将二进制数据转换为可打印 ASCII 文本的编码方案。它不是加密,不是压缩——它只是换了一种“写法”,让二进制内容能在只支持文本的系统里安全传输。

试一试

文本 → Base64

Base64

13 字符 → 20 个 Base64 字符(+54%)

Base64 → 文本

解码文本

Base64 是什么

Base64 是一种二进制到文本的编码方案,由 RFC 4648 定义。它的名字来自它使用64 个可打印 ASCII 字符(A–Z、a–z、0–9、+、/)表示任意二进制数据。

Base64不是加密,也不是压缩。任何人都可以一键解码 Base64 字符串,不需要密鑰或密码。它唯一做的事是把二进制换成文本——方便传输,不方便保密。

比喻:想象你需要通过只能发文字的渠道寄一张纸质地图。你可以用经纬度坐标把地图上每个点重新描述成文字——内容没变,只是换了一种能传递的格式。Base64 对二进制数据做的是同样的事。

为什么 Base64 会被发明

早期的电子邮件协议(SMTP)和许多网络协议只设计用来传输7-bit ASCII 文本。二进制数据(图片、文件)包含值为 0–255 的任意字节,其中很多字节在这些协议里有特殊含义(换行、结束符、控制字符),直接传输会导致内容损坏。

Base64 通过只使用 64 个“安全”的 ASCII 字符,确保编码后的数据在任何文本协议中都能原样传输。今天它最常见的用途包括:

Base64 是怎么工作的

原始文件 / 文本

Binary data

二进制字节

01001101 01100001…

Base64 编码

每 3 字节 → 4 字符

纯文本字符串

TWFu…(可安全传输)

编码过程分三步:

  1. 1
    取 3 个字节(24 bit): 从输入数据每次取 3 个字节,拼成一个 24 位的二进制数。
  2. 2
    拆成 4 组 6 bit: 将 24 bit 均分为 4 组,每组 6 bit。6 bit 最多表示 64 个不同的值(2⁶ = 64)。
  3. 3
    查表替换为字符: 用每组 6 bit 的值(0–63)查 Base64 字母表,得到对应的 ASCII 字符。3 个字节变成 4 个字符。

示例:字符串 Man 如何编码为 TWFu

输入字符Man
ASCII 字节010011010110000101101110
6-bit 分组010011010110000101101110
十进制索引1922546
Base64 字符TWFu

3 个字节(24 bit)→ 4 个 Base64 字符 = 体积 ×4/3,即增大约33%

Base64 字母表

标准 Base64(RFC 4648)使用以下 64 个字符,加上 = 作为填充符:

A–Z

ABCDEFGHIJKLMNOPQRSTUVWXYZ

索引 0–25

a–z

abcdefghijklmnopqrstuvwxyz

索引 26–51

0–9

0123456789

索引 52–61

+ /

+/

索引 62–63

Base64URL 变体(用于 JWT 和 URL)将 + 替换为 -,将 / 替换为 _,并省略 = 填充,避免在 URL 和查询字符串中产生歧义。

实际例子

普通文本

原始

Hello, World!

Base64

SGVsbG8sIFdvcmxkIQ==

末尾 == 是 padding,因为 13 字节不是 3 的倍数

Data URL(图片内嵌)

原始

<img src="data:image/png;base64,iVBORw0KGgo…">

Base64

CSS: background-image: url("data:image/png;base64,…")

直接写在 HTML/CSS 里,无需额外 HTTP 请求

JWT Payload(Base64URL)

原始

{"sub":"1234567890","name":"Alice","iat":1516239022}

Base64

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNTE2MjM5MDIyfQ

无 = 填充,用 - 和 _ 替换 + 和 /(Base64URL)

HTTP Basic Auth

原始

username:password

Base64

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

仅编码,不加密——必须配合 HTTPS 使用

Base64 的局限性

体积增大约33%

每 3 字节变为 4 字符,加上填充符,编码后体积约为原来的 1.33 倍。大文件不适合 Base64。

不是加密

Base64 无法保护数据。任何人一行代码即可解码。敏感数据必须用真正的加密算法。

浏览器处理大文件会卡

FileReader.readAsDataURL() 在主线程全量处理,10 MB 文件足以让页面卡顿。

无法流式处理

标准 Base64 需要完整数据才能编解码,不支持逐块流式处理,不适合实时数据。

相关工具

常见问题

Base64 是什么?

Base64 是一种将二进制数据编码为可打印 ASCII 文本的方案,使用 64 个字符(A–Z、a–z、0–9、+、/)表示任意二进制内容。它让二进制数据能在只支持文本的协议中安全传输。

Base64 是加密吗?

不是。Base64 是编码,不是加密。没有密鑰,任何人都可以一行代码解码。不要用 Base64 保护敏感数据。

为什么 Base64 会让文件变大?

Base64 将每 3 字节编码为 4 个字符(每字符 1 字节),体积变为原来的 4/3,约增大 33%。这是用文本传输二进制数据不可避免的代价。

Base64 和 Base64URL 有什么区别?

Base64URL 是 URL 安全变体:将 + 替换为 -,将 / 替换为 _,并省略 = 填充。这样编码结果可以直接放在 URL 和查询字符串中不会被误解析。JWT 使用的就是 Base64URL。

什么时候应该用 Base64?

需要在纯文本环境中传递二进制数据时——例如 CSS/HTML 内嵌小图片、JSON API 传文件附件、HTML 邮件嵌入图片。文件较大或需要上传到服务器时,应使用 multipart/form-data。

怎么在 JavaScript 中编解码 Base64?

浏览器内置 btoa()(编码)和 atob()(解码)。但这两个函数只支持 Latin-1 字符,处理中文或 emoji 需要先用 TextEncoder 转为 UTF-8 字节再编码,解码时用 TextDecoder。Node.js 可以用 Buffer.from(str).toString('base64') 和 Buffer.from(b64, 'base64').toString('utf8')。