什么是Base64以及如何使用:编码和解码完整指南

阅读时间 9 分钟

了解什么是Base64、编码如何工作、何时在Web开发中使用它,以及如何免费编码或解码文本、图片和文件。

什么是Base64编码

Base64是一种编码系统,它使用64个可打印字符将二进制数据(0和1)转换为文本表示。这64个字符包括字母A-Za-z、数字0-9、符号+/,以及用作填充的=字符。

核心思想很简单:许多计算机系统只能安全地处理纯文本。通过电子邮件、URL或JSON字段发送原始二进制数据(如图片或压缩文件)可能会损坏数据。Base64通过将二进制数据转换为任何系统都能无问题传输的"安全"文本来解决这个问题。

例如,3个二进制字节01001000 01101111 01101100(代表"Hol")变成4个Base64字符SG9s。该过程将位分成6位一组(而不是8位),然后映射到64字符表。

立即使用NexTools免费Base64编码器尝试编码。

Base64工作原理:逐步详解

Base64算法遵循精确的数学过程,将每3个输入字节转换为4个输出字符:

步骤1:转换为二进制。将原始文本的每个字节转换为8位二进制表示。例如,字母"M"是ASCII中的字节77,二进制为01001101

步骤2:分成6位组。将位从8个一组重新组织为6个一组。以"Man"(3字节=24位)为例,分为4个6位组:010011 | 010110 | 000101 | 101110

步骤3:映射到Base64表。每个6位组(值0-63)映射到表中的一个字符:19=T22=W5=F46=u。结果:"Man" → "TWFu"。

步骤4:用"="填充。如果原始字节不是3的倍数,则添加填充。剩余1个字节时追加"==";剩余2个字节时追加"="。

完整数值示例:

文本字节二进制6位组Base64
Hi72, 10501001000 01101001010010 000110 100100SGk=
Man77, 97, 11001001101 01100001 01101110010011 010110 000101 101110TWFu
A6501000001010000 010000QQ==

输出始终比原始数据大约33%(每3个字节产生4个字符)。使用NexTools Base64解码器解码任何Base64文本。

2026年Base64最常见的使用场景

Base64在现代技术中的应用远比您想象的要广泛:

1. HTML和CSS中的Data URI。您可以直接在HTML或CSS代码中嵌入图片,无需单独的HTTP请求。例如:<img src="data:image/png;base64,iVBORw0KGgo...">。这消除了一个服务器请求,对于小图标(小于2-3 KB)很理想。根据HTTP Archive的数据,2025年18%的网站在其CSS中使用了至少一个Data URI。

2. 电子邮件附件(MIME)。原始SMTP协议仅支持7位ASCII文本。为了发送文件附件(PDF、图片、文档),MIME标准将它们编码为Base64。每次收到带附件的电子邮件时,您的邮件客户端都在自动解码Base64。

3. JWT令牌(JSON Web Tokens)。JWT认证令牌有3个由点分隔的部分,每个部分都用Base64url(使用-_代替+/的变体)编码。2026年数百万个API使用JWT进行认证。

4. REST API和JSON。当需要在JSON载荷(文本)中发送二进制数据时,Base64是标准解决方案。

5. 数据库存储。一些NoSQL数据库或SQL中的文本字段存储Base64编码的二进制数据。虽然不如BLOB高效,但在系统间更具可移植性。

6. 基本混淆。虽然这不是加密或安全措施,但Base64用于混淆不应被一眼看懂的数据,如配置字符串或URL参数。

JavaScript和Web开发中的Base64

JavaScript在浏览器和Node.js中都提供了处理Base64的原生函数:

在浏览器中:

  • btoa(string) — 将字符串编码为Base64。示例:btoa("Hello")"SGVsbG8="
  • atob(string) — 将Base64解码为文本。示例:atob("SGVsbG8=")"Hello"

注意Unicode:btoa()在处理Unicode字符(中文、日文、表情符号)时会失败。对于包含特殊字符的文本,需要中间步骤:

const base64 = btoa(unescape(encodeURIComponent("中文测试")));

在Node.js中:

  • Buffer.from(string).toString('base64') — 编码
  • Buffer.from(base64String, 'base64').toString('utf-8') — 解码

Node.js通过Buffer自动处理Unicode,没有btoa/atob的问题。

如果不想编写代码,使用NexTools Base64编码器,它在浏览器中处理所有内容,无需将文件上传到任何服务器。

Base64与其他编码方式的比较

重要的是不要将Base64与加密或其他编码混淆。每种方式都有不同的目的:

方法目的无密钥可逆安全
Base64将二进制表示为文本是,任何人都可以解码
十六进制(Base16)将字节表示为十六进制
URL编码转义URL中的特殊字符
AES/RSA(加密)用密钥保护数据否,需要密钥
SHA-256(哈希)验证数据完整性否,单向部分

常见错误:将Base64用作"安全措施"。Base64不加密任何东西。任何人都可以在毫秒内解码它。如果需要保护数据,请使用真正的加密(例如AES-256)。如果需要验证完整性,请使用哈希生成器

何时使用哪种方式:

  • 需要通过文本传输二进制 → Base64
  • 需要以可读形式显示字节 → 十六进制
  • 需要在URL中放入数据 → URL编码
  • 需要保护机密数据 → 加密(AES/RSA)
  • 需要验证文件未被修改 → 哈希(SHA-256)

Base64变体:标准、URL安全和MIME

Base64不止一种。不同的RFC标准定义了几种变体:

标准Base64(RFC 4648):使用A-Za-z0-9+/和填充=。最常见的版本,用于MIME、PEM和大多数API。

Base64url(RFC 4648 §5):+替换为-,将/替换为_。删除或使填充=可选。专为URL和文件名设计。JWT令牌始终使用此变体。

MIME Base64(RFC 2045):与标准相同,但每76个字符插入换行符。用于电子邮件和PEM证书。

Base32:仅使用32个字符(A-Z2-7)。效率较低(5字节→8字符 vs Base64的3→4),但不区分大小写。用于TOTP(Google Authenticator)和Tor的onion地址。

实用建议:如果使用URL或JWT,请始终使用Base64url。如果为JSON API或电子邮件编码数据,请使用标准Base64。NexTools编码器支持两种变体。

性能和大小:何时不应使用Base64

Base64有代价:编码后的数据比原始数据大约33%。这有重要影响:

内联图片:2 KB规则。将图片嵌入为Data URI仅对非常小的文件(图标、精灵图)值得。100 KB的图片变成约133 KB的Base64文本,而且浏览器无法将其作为单独文件缓存。2026年推荐做法:

  • 小于2 KB的图片 → Data URI(节省一个HTTP请求)
  • 2-10 KB的图片 → 逐案评估
  • 大于10 KB的图片 → 始终使用<img src="url">的单独文件

API和JSON载荷。如果API需要发送大文件,JSON中的Base64效率低下。更好的替代方案:

  • 上传使用multipart/form-data(无需编码)
  • 预签名URL(客户端直接上传到存储)
  • 使用Content-Type: application/octet-stream进行二进制流传输

具体开销数据:

原始大小Base64开销
1 KB1.33 KB+33%
100 KB133 KB+33 KB
1 MB1.33 MB+330 KB
10 MB13.3 MB+3.3 MB

如何免费编码和解码Base64

根据您的场景,有多种方式处理Base64:

选项1:在线工具(最快)。NexTools Base64编码器在浏览器中处理所有内容。粘贴文本或上传文件,即时获得结果。数据不会离开您的计算机。

选项2:命令行。

  • Linux/Mac:echo -n "Hello" | base64SGVsbG8=
  • 解码:echo "SGVsbG8=" | base64 --decodeHello
  • 文件:base64 image.png > image.b64

选项3:Python。

  • import base64
  • base64.b64encode(b"Hello").decode()"SGVsbG8="
  • base64.b64decode("SGVsbG8=").decode()"Hello"

对于大多数只需要快速编码或解码的用户来说,在线工具是最实用的选择。如果您经常使用API或进行开发,终端或您偏好的编程语言会更高效。

如果需要处理复杂的数据结构,您还可以使用NexTools JSON转换器将数据转换为其他格式。

试试这个工具:

打开工具

常见问题

Base64和加密是一样的吗

不是。Base64是编码,不是加密。任何人都可以在没有密钥的情况下解码Base64。就像用另一种字母表写消息:改变了表示形式但不保护内容。加密数据需要AES-256或RSA等算法。

为什么Base64编码后的数据比原始数据大

因为Base64将每3个字节(24位)转换为4个字符(32位),增加了33%。此外,如果原始数据不是3字节的倍数,会添加'='填充,略微增加大小。1 MB文件在Base64中变为约1.33 MB。

Base64在电子邮件中有什么用

原始SMTP协议仅支持7位ASCII文本,无法直接发送二进制文件。MIME使用Base64将文件附件编码为SMTP可以传输的ASCII文本。邮件客户端在发送时自动编码,接收时自动解码。

标准Base64和Base64url有什么区别

标准Base64使用在URL中有特殊含义的'+'和'/'('+'是空格,'/'是路径分隔符)。Base64url分别用'-'和'_'替换它们,并使填充'='可选。JWT和URL中的任何数据都应使用Base64url。

将Base64编码的敏感数据放在URL中安全吗

不安全。Base64编码不提供任何安全性。看到URL的任何人都可以立即解码数据。如果需要通过URL传递敏感数据,请先用AES加密,然后将加密结果编码为Base64url。

可以为网站将大图片编码为Base64吗

技术上可以,但不应该这样做。500 KB的图片变成HTML中约667 KB的Base64文本,会增加页面大小、阻止浏览器缓存并降低加载速度。仅对小于2 KB的图片使用Base64 Data URI。