Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。由于 \(2^6=64\) ,所以每 6 个比特为一个单元,对应某个可打印字符。3 个字节有 24 个比特,对应于 4 个 Base64 单元,即 3 个字节可由 4 个可打印字符来表示。
——维基百科
编码原理
标准 Base64 里的 64 个可打印字符是 A-Za-z0-9+/,分别依次对应索引值 0-63。索引表如下:
| 数值 | 字符 | 数值 | 字符 | 数值 | 字符 | 数值 | 字符 |
|---|
| 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 | / |
编码时,每 3 个字节一组, 即 8bit*3=24bit,按照 6bit 一组重新划分成 4 组,代表一个编码后的索引值。举个例子:
| 原文 | c | a | t | |
|---|
| ASCII 码 | 99 | 97 | 116 | |
| 原 8 位二进制 | 01100011 | 01100001 | 01110100 | |
| 折算 6 位二进制 | 011000 | 110110 | 000101 | 110100 |
| 索引 | 24 | 54 | 5 | 52 |
| BASE64 | Y | 2 | F | 0 |
可以看到 cat 编码后变成了 Y2F0。用 Python 验算一下:
1
2
| import base64
base64.b64encode(b'cat')
|
如果待编码内容的字节数不是 3 的整数倍,那需要进行一些额外的处理:
- 如果最后剩下 2 个字节(16bit),那么将补 2 个 0 位(凑成 18bit),编码成 3 个 Base64 字符,然后补一个 =。
| 原文 | c | a | | |
|---|
| ASCII 码 | 99 | 97 | | |
| 原 8 位二进制 | 01100011 | 01100001 | | |
| 折算 6 位二进制 | 011000 | 110110 | 000100 | |
| 索引 | 24 | 54 | 4 | |
| BASE64 | Y | 2 | E | = |
1
2
| import base64
base64.b64encode(b'ca')
|
- 如果最后剩下 1 个字节(8bit),那么将补 4 个 0 位(凑成 12bit),编码成 2 个 Base64 字符,然后补两个 =。
| 原文 | c | | | |
|---|
| ASCII 码 | 99 | | | |
| 原 8 位二进制 | 01100011 | | | |
| 折算 6 位二进制 | 011000 | 110000 | | |
| 索引 | 24 | 48 | | |
| BASE64 | Y | w | = | = |
1
2
| import base64
base64.b64encode(b'c')
|
Author
winsphinx
LastMod
2021-01-16
(d36d5b2b)
[笔记] BASE64
License
