Base64 是什么?为什么 Web 开发中到处都能看到 Base64?
Base64 是一种在前端、后端、网络传输、数据持久化中都极为常见的编码方式,尤其在 Web 开发中应用广泛,如图片转字符串、文件嵌入 HTML、API 数据传输等。本文将从原理到实际用途做一次完整介绍,用最清晰的方式告诉你:Base64 的原理、用途、优缺点、常见格式、Data URL 结构、各种实际案例,以及实用的 Base64 在线编解码工具。
适合人群: Web 开发者、前端工程师、后端工程师、对 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 | / |
字符表中总计 64 个字符,因此叫 Base64( 注:加上填充符号 = 其实是65个字符 O(∩_∩)O )。
注意: Base64 不是加密,只是编码,任何人都可以还原原始数据。
Base64 的主要作用是:
例如:图片、音频、PDF、zip 文件。
常见格式:
data:image/png;base64,iVBORw0KGgoAAAANS...
很多协议只支持 文本,不支持传输二进制, 比如早期 Email 协议(MIME)早期浏览器、表单、URL、Cookie、JSON、XML、HTML的属性值等。
Base64的核心思想是将 3 个字节(3*8=24 位)拆成 4 组,每组 6 位(4*6=24 位)。每 6 位对应 Base64 字符表中的一个字符,若最后不足 3 字节,用 = 补位。
简而言之:将每3个原始字节的数据,转换为4个可打印字符。
[8 bits][8 bits][8 bits] → [6 bits][6 bits][6 bits][6 bits]
24 bits 4 Base64
如果数据长度不是 3 的倍数,那么不足的部分会用 = 补充。
===我们假设有一块由 3 个字节组成的原始数据。
示例: 假设原始数据是 ASCII 字符 "M", "a", "n":
| 原始字符 | ASCII 值 (十进制) | 二进制表示 (8 bits) |
|---|---|---|
| M | 77 | 01001101 |
| a | 97 | 01100001 |
| n | 110 | 01101110 |
将它们连接起来,形成一个 24 位的长串:
01001101 01100001 01101110 (Total: 24 bits)
Base64 的目标是使用 64 个字符,而 2^6 = 64。这意味着每个 Base64 字符只需要 6 位二进制数据来表示。
我们将上面 24 位的长串,按顺序重新划分为 4 个独立的 6 位数据块。
010011 010110 000101 101110
第 1 块: 010011 (6 bits)
第 2 块: 010110 (6 bits)
第 3 块: 000101 (6 bits)
第 4 块: 101110 (6 bits)
现在,我们把这 4 个 6 位数据块转换成十进制数,然后去查找标准 Base64 字符表(索引 0-63)。
| 块号 | 6 位二进制 | 对应十进制值 | 查找 Base64 字符 |
|---|---|---|---|
| 1 | 010011 | 19 | T |
| 2 | 010110 | 22 | W |
| 3 | 000101 | 5 | F |
| 4 | 101110 | 46 | u |
最终编码结果: 3 个字节的 "Man" 经过 Base64 编码后,变成了 4 个字符的字符串 "TWFu"。
| 文本 | M | a | n | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ASCII编码 | 77 | 97 | 110 | |||||||||||||||||||||
| 二进制位 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
| 索引 | 19 | 22 | 5 | 46 | ||||||||||||||||||||
| Base64编码 | T | W | F | u | ||||||||||||||||||||
如果原始数据的总字节数不是 3 的倍数,编码过程依然保持 8 bits -> 6 bits 的转换,但在末尾会通过补 0 来凑满 6 位的组,并使用 = 来标记填充。
原始数据: 2 字节 = 16 位。
所需位数: Base64 至少需要 3 组 6 位(18 位)才能生成 3 个字符。
步骤:
取 16 位原始数据。
在末尾补 2 个 0,凑成 18 位。
划分为 3 个 6 位组。
生成 3 个 Base64 字符。
因为只使用了 3 个字符,为了让结果长度为 4 的倍数,补 1 个 =。
结果形式: 3 个 Base64 字符 加1个 =。
原始数据: 1 字节 = 8 位。
所需位数: Base64 至少需要 2 组 6 位(12 位)才能生成 2 个字符。
步骤:
取 8 位原始数据。
在末尾补 4 个 0,凑成 12 位。
划分为 2 个 6 位组。
生成 2 个 Base64 字符。
为了让结果长度为 4 的倍数,补 2 个 =。
结果形式: 2 个 Base64 字符 加2个 =。
| 文本(1 Byte) | A | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 二进制位 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | ||||||||||||
| 二进制位(補0) | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 留空填充 | 留空填充 | ||||||||||
| Base64编码 | Q | Q | = | = | ||||||||||||||||||||
| 文本(2 Byte) | B | C | ||||||||||||||||||||||
| 二进制位 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | ||||||
| 二进制位(補0) | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 留空填充 | |||||
| Base64编码 | Q | k | M | = | ||||||||||||||||||||
| 原文 | ASCII 码 | Base64 结果 |
|---|---|---|
| Man | 77 97 110 | TWFu |
| BC | 66 67 | QkM= |
| A | 65 | QQ== |
| hello | 104 101 108 108 111 | aGVsbG8= |
data:[mime-type];base64,[Base64编码内容]
| MIME Type | 描述 |
|---|---|
image/png |
便携式网络图形(PNG)。无损压缩,常用于图标和需要透明度的图片。 |
image/jpeg |
联合图片专家组(JPEG)。有损压缩,常用于照片。 |
image/gif |
图形交换格式(GIF)。支持动画和透明度(但不是全透明)。 |
image/svg+xml |
可缩放矢量图形(SVG)。基于XML的矢量图。 |
image/webp |
WebP格式,谷歌开发,提供更小的文件尺寸。 |
text/plain |
纯文本。 |
text/css |
层叠样式表(CSS)文件。常用于将小段样式直接嵌入。 |
text/html |
HTML 文档。可以用来嵌入一个完整的网页。 |
text/javascript |
JavaScript 代码。常用于嵌入小的脚本片段。 |
audio/mpeg |
MP3 音频文件。 |
video/mp4 |
MP4 视频文件。 |
application/json |
JSON 格式数据。 |
application/xml |
XML 格式数据。 |
application/pdf |
PDF 文档。 |
application/octet-stream |
默认的二进制类型。如果不知道确切的文件类型,可以使用这个。 |
data:image/png;base64,iVBORw0KGgoAAAANS...
data:audio/mpeg;base64,//uQxA...
data:application/pdf;base64,JVBERi0xLjQKJeLj...
这些都是浏览器常见的 MIME 类型(你可以覆盖几乎所有文件格式)。
特别适合小图标、SVG、CSS Sprite 替代方案。浏览器可直接渲染,不需要文件 URL。
图片直接嵌入 HTML/CSS:
<img src="data:image/png;base64,xxxx">
作为CSS的背景图片:
background-image: url("data:image/svg+xml;base64,PHN2ZyB...=");
使用 FileReader:
reader.readAsDataURL(file);
浏览器自动生成 Base64。
这样做无需 multipart/form-data,例如在 REST API (JSON / XML)或 GraphQL 上传文件。
本地存储 ( LocalStorage ) 只能存字符串,因此 Base64 非常适合。
无需外部链接。
二进制数据以文本形式存储,安全、简单,但占用空间大。
虽然不是加密,但Base64可以用于对一些轻量级配置或参数进行简单的混淆,避免数据被用户一眼看穿。
普通 Base64 中:
+ /
在 URL 中有特殊含义。
Base64URL 替换规则:
+ → -
/ → _
= 可能被去掉
常用于:
例如:
abc+123/== → abc-123_
btoa("Hello")
btoa(unescape(encodeURIComponent("中文")))
decodeURIComponent(escape(atob(base64str)))
注意:btoa 只能接受 UTF-8 之前的 Latin1 字符,中文需要转码:
const reader = new FileReader();
reader.onload = () => {
const base64 = reader.result; // data:image/png;base64,AAAB...
};
reader.readAsDataURL(file);
base64_encode($data);
base64_decode($data);
import base64
base64.b64encode(b"hello")
base64.b64decode("aGVsbG8=")
// 常用库: cppcodec / OpenSSL / Boost
#include <cppcodec/base64_rfc4648.hpp>
string encoded = base64::encode("hello");
string decoded = base64::decode(encoded);
为了更高效地处理 Base64 字符串,你可以使用本站提供的 在线 Base64 编解码工具(支持文本/图片/音视频/任意文件),纯前端 · 基于 Bootstrap · 安全无上传 · 隐私100%本地处理。
| 功能类型 | 说明 |
|---|---|
| 文本 Base64 编码/解码 | 输入文本即可即时转换 |
| 图片 Base64 编码/解码 | 支持 PNG/JPEG/GIF/WebP |
| 音频/视频 Base64 编码 | 支持 MP3/MP4/WAV 等 |
| 任意文件 Base64 编码 | PDF、ZIP、文档均可 |
| Base64 还原文件(Blob) | 将 Base64 转为可下载的文件 |
| 多端适配 | 支持电脑与手机使用 |
| 纯前端运行 | 文件不会上传到服务器 |
不是! 任何 Base64 字符串都可以轻松反解,安全性极低。
会变大 33%。
不适合。会造成网页加载慢、DOM 变大。
因为 Data URL 格式规定必须先写 MIME 类型。
URL-safe Base64 会将以下替换:
+ → -/ → _用于 JWT、OAuth 等。