正在加载,请稍候…

Base64 与 Hex 编码:区别、使用场景及如何选择

Base64 和十六进制都是将二进制数据表示为文本的方式,但工作原理不同,适用于不同场景。本文介绍两者的区别及选择方法。

Base64 vs Hex Encoding: Differences, Use Cases, and When to Use Each

它们共同解决的问题

计算机以二进制形式存储一切——字节序列,值范围 0 到 255。当需要在只处理可打印文本的系统(如电子邮件正文、JSON 字段、URL 参数、cookie)中传输或存储二进制数据时,必须先对其进行编码。

Base64 和十六进制是两种最常见的解决方案。它们解决相同的问题,但做出了不同的权衡。

Base64 vs Hex Encoding: Differences, Use Cases, and When to Use Each illustration

Hex 编码的工作原理

十六进制使用 16 个字符:0-9 和 a-f。每个字节(0-255)映射为两个十六进制字符,因为 256 等于 16 的平方。

"Hi"  →  bytes: 72, 105  →  hex: 48 69  →  "4869"

大小开销:每个字节变成 2 个字符,因此十六进制编码数据的大小恰好是原始数据的 2 倍

字符集 [0-9a-f] 在几乎所有上下文中都是安全的——URL、文件名、终端输出、数据库字段、日志文件。

Base64 编码的工作原理

Base64 使用 64 个字符:A-Z、a-z、0-9,以及 + 和 /(= 用于填充)。每 3 个输入字节映射为 4 个 Base64 字符。

"Hi!"  →  bytes: 72, 105, 33  →  base64: "SGkh"

大小开销:3 个字节变成 4 个字符,因此 Base64 比原始数据大约 大 33%(相比之下,十六进制开销为 100%)。对于图像或文件等大型负载,这种差异是显著的。

Base64 vs Hex Encoding: Differences, Use Cases, and When to Use Each illustration

并排比较

属性 Hex Base64
使用的字符 0-9, a-f(16 个字符) A-Z, a-z, 0-9, +, /(64 个字符)
大小开销 +100%(原始大小的 2 倍) +33%(大约原始大小的 4/3)
人类可读性 字节值可见 不可读
默认 URL 安全 否(+ 和 / 需要转义)
URL 安全变体 Base64url:使用 - 和 _
常见用例 校验和、哈希、颜色 图像、文件、JWT、电子邮件

何时使用 Hex

校验和与哈希——SHA-256、MD5 以及大多数哈希函数按惯例输出十六进制。运行 sha256sum 会得到一个 64 字符的十六进制字符串。该格式可读性足够,可以直观地比较前 8 个字符。

颜色代码——CSS 颜色如 #ff6600 是十六进制:R=ff (255), G=66 (102), B=00 (0)。

二进制协议调试——检查原始网络数据包或文件头时,十六进制显示精确的字节值。xxd、hexdump 和 Wireshark 等工具默认使用十六进制。

数据库 ID 和令牌——许多系统将 UUID 存储为 32 字符的十六进制字符串。十六进制紧凑且 URL 安全,无需转义。

// Node.js:以十六进制形式输出哈希
const hash = crypto.createHash('sha256').update(data).digest('hex');

// Node.js:以十六进制形式生成随机令牌
const token = crypto.randomBytes(32).toString('hex'); // 64 字符

Base64 vs Hex Encoding: Differences, Use Cases, and When to Use Each illustration

何时使用 Base64

在文本格式中嵌入二进制数据——JSON 没有二进制类型。在 JSON 字段中存储图像、证书或文件需要使用 Base64。对于大型负载,较低的大小开销很重要。

电子邮件附件——自 1990 年代初以来,电子邮件附件的 MIME 编码一直使用 Base64。

JWT(JSON Web Token)——JWT 头部和负载使用 Base64url 编码。可以通过按 . 分割并对每个部分进行 Base64 解码来解码 JWT——无需密钥即可读取声明。

数据 URI——直接在 CSS 或 HTML 中嵌入图像使用 Base64:data:image/png;base64,iVBOR...

TLS 证书——PEM 格式(-----BEGIN CERTIFICATE----- 格式)是 Base64 编码的 DER 数据。

// Node.js:编码为 Base64
const encoded = Buffer.from(binaryData).toString('base64');

// 用于 JWT 和 URL 的 URL 安全 Base64
const urlSafe = encoded.replace(/+/g, '-').replace(///g, '_').replace(/=/g, '');

URL 安全性:一个实际问题

标准 Base64 使用 + 和 /,这两个字符在 URL 中都有特殊含义(+ 表示空格;/ 是路径分隔符)。如果需要在 URL 查询参数中使用 Base64,要么进行百分号编码,要么切换到 Base64url 变体(RFC 4648):将 + 替换为 -,/ 替换为 _,并去掉 = 填充。

十六进制没有这个问题——字符 0-9a-f 在任何上下文中都是 URL 安全的。

快速决策指南

  • 表示 哈希或校验和?→ Hex
  • 在 JSON、HTML 或电子邮件中 嵌入文件或图像?→ Base64
  • 构建 JWT 或 OAuth 令牌?→ Base64url
  • 在字节级别 调试二进制数据?→ Hex
  • 在 URL 中 存储随机字节作为令牌?→ Hex(更简单)或 Base64url(更短)
  • CSS 颜色代码?→ Hex(通用标准)

→ 尝试 Base64 String Converter 即时编码和解码,或使用 Hash Text Tool 获取十六进制编码的哈希。