base64encodingbinarytutorial

什么是Base64编码?完整指南

· Cosyslabs

Base64编码使用一组64个可打印字符将二进制数据转换为ASCII文本。它用于通过HTTP和电子邮件等基于文本的协议安全传输二进制内容,以及直接在HTML、CSS和JSON数据中嵌入图像或文件,不会产生数据损坏或丢失。

为什么需要Base64

许多协议——SMTP、HTTP头部、XML——设计之初只用于传输文本,而非任意二进制字节。当通过这些通道发送原始二进制数据时,某些字节值会被解释为控制字符、换行符或空终止符,从而导致数据损坏。Base64通过将所有可能的字节序列映射到一个安全的可打印ASCII字符子集来解决这个问题。

Base64的工作原理:6位分组

Base64通过将8位字节重新分组为6位块来处理二进制数据。

  1. 取三个输入字节(共24位)。
  2. 分成四个6位组。
  3. 将每个6位值(0–63)映射到Base64字母表中的一个字符。

Base64字母表使用:

  • A–Z(值0–25)
  • a–z(值26–51)
  • 0–9(值52–61)
  • +/(值62–63)
  • = 作为填充

示例:

输入:  "Man"
二进制: 01001101 01100001 01101110
分组:  010011 010110 000101 101110
值:    19     22     5      46
输出:  T      W      F      u  → "TWFu"

当输入长度不能被三整除时,会附加 === 填充。

JavaScript中的编码和解码

现代JavaScript为浏览器环境提供内置的Base64支持:

// 编码
const encoded = btoa("Hello, World!");
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="

// 解码
const decoded = atob("SGVsbG8sIFdvcmxkIQ==");
console.log(decoded); // "Hello, World!"

对于Node.js(v16+),使用 Buffer

// 编码
const encoded = Buffer.from("Hello, World!").toString("base64");

// 解码
const decoded = Buffer.from("SGVsbG8sIFdvcmxkIQ==", "base64").toString("utf8");

URL安全的Base64

标准Base64使用 +/,这些是URL中的保留字符。URL安全的Base64将它们替换:

标准URL安全
+-
/_
=省略或 %3D

JWT令牌使用不带填充的URL安全Base64。解码JWT载荷时,需要在解码前恢复填充:

function decodeJwtPayload(token) {
  const [, payload] = token.split(".");
  const padded = payload.replace(/-/g, "+").replace(/_/g, "/");
  const padLength = (4 - (padded.length % 4)) % 4;
  return JSON.parse(atob(padded + "=".repeat(padLength)));
}

数据URI

数据URI使用Base64将文件内容直接嵌入HTML或CSS:

<!-- 内联PNG图像 -->
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />

<!-- CSS中的内联SVG -->
.icon {
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucy...");
}

数据URI适用于:

  • 减少HTTP请求的小图标
  • 需要嵌入资源的离线/PWA应用
  • 外部图像被屏蔽的电子邮件模板

避免对大图像使用数据URI。它们会增加HTML大小、绕过浏览器缓存,且无法延迟加载。

常见用例

HTTP基本认证

Authorization 头部使用Base64对凭据进行编码:

Authorization: Basic dXNlcjpwYXNzd29yZA==

解码后得到 user:password。这里Base64提供的是编码,而非加密——始终使用HTTPS。

电子邮件附件(MIME)

SMTP以文本形式传输电子邮件。MIME将二进制附件编码为Base64块:

Content-Transfer-Encoding: base64

SGVsbG8sIFdvcmxkIQ==

API响应

某些API在JSON内以Base64字符串返回二进制数据(缩略图、PDF):

{
  "filename": "report.pdf",
  "content": "JVBERi0xLjQK..."
}

Base64不是加密

Base64无需密钥即可逆——任何人都可以立即解码。它不提供任何安全保障。切勿使用Base64来"隐藏"密码、API密钥或敏感数据。

大小开销

Base64将数据大小增加约33%:每3个字节变成4个字符。对于1MB的二进制文件,Base64表示约为1.37MB。传输时结合gzip压缩可部分恢复大小。

原始大小Base64大小
1 KB~1.37 KB
100 KB~137 KB
1 MB~1.37 MB

立即试用

使用Base64编码/解码工具直接在浏览器中编码和解码字符串、文件和数据URI——数据不会离开您的设备。

总结

  • Base64使用64个可打印字符将二进制转换为文本
  • 通过将8位字节重新分组为6位块来工作
  • URL安全变体将 +// 替换为 -/_
  • 用于HTTP认证、电子邮件附件、数据URI和API
  • 不是加密——不提供任何安全保证
  • 增加约33%的大小开销

更多Cosyslabs工具

处理二进制数据和文件格式?这些Cosyslabs工具涵盖相关用例:

  • PDF Convert All — 在线转换、合并、压缩和提取PDF。
  • Unit Convert All — 转换数据存储大小(字节 ↔ KB ↔ MB ↔ GB)。
  • Routine Toolkit — 日常生产力工具:字数统计、贷款计算器等。
  • Cosyslabs — Dev Tools !、PDF Convert All等产品背后的工作室。