﻿---
title: Base64 Encoding
date: 2024-01-24
excerpt: Base64编码
tags: [Base64, Web]
thumbnail: https://assets.vluv.space/cover/base64.avif
cover: https://assets.vluv.space/cover/base64.avif
---

## What is Base64?

> **Base64** is a binary-to-text encoding scheme. It represents binary data in a printable ASCII string format by translating it into a radix-64 representation.
> Base64 encoding is commonly used when there is a need to transmit binary data over media that do not correctly handle binary data and is designed to deal with textual data belonging to the 7-bit US-ASCII charset only.
> One example of such a system is Email (SMTP), which was traditionally designed to work with plain text data in the 7-bit US-ASCII character set. Although, It was later extended to support non US-ASCII text messages as well as non-text messages such as audio and images, It is still recommended to encode the data to ASCII charset for backward compatibility.
> [_What is Base64 Encoding and How does it work?_](https://www.base64encoder.io/learn/)

- Base64 用 6 个 bit 来表示一个字符，输入流中每 3 个 Bytes 由 4 个 Base64 字符表示

  ```c
  3 Bytes = 3 * 8 bits = 24 bits = 4 * 6 bits
  Base64 Encoding算法会在4组6bit各自的头部添0：
  4 * 6 bit -> 4 * 8 bits = 4 Bytes
  这即是Base64编码后数据长度增加1/3的原因
  ```

- Base64 包含 64 个字符(26 个大写字母，26 个小写字母，10 个数字，2 个特殊字符+，/)
- Base64 常用于在 URL、Cookie、网页中传输少量二进制数据。

## How does Base64 Encoding work?

Base64 encoding works with a 65-character subset of the US-ASCII charset. The first 64 characters out of the 65-character subset are mapped to an equivalent 6-bit binary sequence $2^6 = 64$. The extra 65th character (=) is used for padding.

```wikitext
## The Base64 Alphabet

Value Encoding  Value Encoding  Value Encoding  Value Encoding
    0 A            17 R            34 i            51 z
    1 B            18 S            35 j            52 0
    2 C            19 T            36 k            53 1
    3 D            20 U            37 l            54 2
    4 E            21 V            38 m            55 3
    5 F            22 W            39 n            56 4
    6 G            23 X            40 o            57 5
    7 H            24 Y            41 p            58 6
    8 I            25 Z            42 q            59 7
    9 J            26 a            43 r            60 8
   10 K            27 b            44 s            61 9
   11 L            28 c            45 t            62 +
   12 M            29 d            46 u            63 /
   13 N            30 e            47 v
   14 O            31 f            48 w         (pad) =
   15 P            32 g            49 x
   16 Q            33 h            50 y
```

**Steps**

1. **以 6 bit 为单位将二进制数据分组**，不足 6 个 bit 的在末尾补 0，得到 8 组二进制数据：
   以 ASCII 编码的字符串`HelloWorld\n`为例，其二进制数据为：
   `01001000 01100101 01101100 01101100 01101111 01010111 01101111 01110010 01101100 01100100 00001010`
   分组后为：
   `010010 000110 010101 101100 011011 000110 111101 010111 011011 110111 001001 101100 011001 000000 1010`
2. **将各组二进制转成十进制，根据映射关系得到 Base64 编码**

   ```wikitext
   18 6  21 44 27 6  61 23 27 55 9  44 25 0  40
   S  G  V  s  b  G  9  X  b  3  J  s  Z  A  o
   ```

3. **将 Base64 编码拼接起来，最终结果应为 4 的倍数，不足则在末尾补`=`**
   `SGVs bG9X b3Js ZAO=`

## Why Base64？

在早期的互联网协议中，设计者们主要考虑的是发送文本数据，因此这些协议通常只能处理 ASCII 字符集中的字符。然而，二进制文件（如图片、音频、视频等）包含的数据通常超出了 ASCII 字符集的范围。如果直接发送这些二进制数据，可能有部分字节被解释为控制字符，例如换行符、回车符、制表符等。这些控制字符在传输过程中可能会被解释为其他含义，从而导致数据传输错误。

Base64 编码出现是为了就是解决在网络上发送**二进制数据**的问题。Base64 选取 US-ASCII 中的**64 个可打印字符**作为编码后的字符集，这样就可以保证数据在传输过程中不会被解释为控制字符，从而确保数据传输的安全和可靠。

不过，Base64 编码会导致数据膨胀，大约增加 1/3 的大小。

## Base64's Applications

Base64 的应用非常广泛，包括但不限于：

- 电子邮件：在 MIME（多用途互联网邮件扩展）协议中，Base64 用于编码电子邮件的附件，使其可以通过电子邮件系统发送。电子邮件系统主要设计用于处理文本，而不是二进制数据，因此需要将二进制附件（如图片或文档）转换为文本格式。

- 数据 URI：在网页中，可以使用 Base64 编码的数据 URI 来内嵌图片或其他资源。这样可以减少 HTTP 请求的数量，从而提高页面加载速度。数据 URI 的格式为 `data:[<mediatype>][;base64],<data>`，其中 <mediatype> 是资源的 MIME 类型，<data> 是 Base64 编码的资源数据。

- URL 编码：在某些情况下，URL 可能需要包含二进制数据。由于 URL 只能包含 ASCII 字符，因此需要使用 Base64 编码来编码这些数据。标准的 Base64 编码在 URL 中有特殊含义的字符(+ 和 /)，于是 + 和 / 分别被替换为 - 和 \_。

- 证书和密钥：在 SSL/TLS 和其他安全协议中，证书和密钥通常使用 Base64 编码，以便在文本格式的配置文件中使用。这样可以避免二进制数据在处理或传输过程中可能出现的问题。

- 编码用户凭据：在 HTTP 基本认证中，用户的用户名和密码会被拼接成一个字符串，然后使用 Base64 编码，最后将编码后的字符串放在 HTTP 头的 Authorization 字段中发送给服务器。
