本文作者: jsweibo
本文链接: https://jsweibo.github.io/2019/03/04/%E4%BB%80%E4%B9%88%E6%98%AFBase64/
摘要
本文主要讲述了:
- 什么是 Base64
- Base64 码表
- 编码原理
- 解码原理
正文
什么是 Base64
Base64 是一种使用可打印字符来表示二进制数据的字符编码方案。
1 个 Base64 字符用 6 个二进制位表示。
Base64 将 3 个字节编码为 4 个 Base64 字符。
Base64 码表
Bin | Dec | Hex | Char |
---|---|---|---|
0000 0000 | 0 | 00 | A |
0000 0001 | 1 | 01 | B |
0000 0010 | 2 | 02 | C |
… | … | … | … |
0001 1001 | 25 | 19 | Z |
0001 1010 | 26 | 1A | a |
0001 1011 | 27 | 1B | b |
0001 1100 | 28 | 1C | c |
… | … | … | … |
0011 0011 | 51 | 33 | z |
0011 0100 | 52 | 34 | 0 |
0011 0101 | 53 | 35 | 1 |
0011 0110 | 54 | 36 | 2 |
… | … | … | … |
0011 1101 | 61 | 3D | 9 |
0011 1110 | 62 | 3E | + |
0011 1111 | 63 | 3F | / |
此外,=
用作后缀。
编码原理
- 根据 ASCII 码表,每次取出 3 个字节(若不足 3 字节,则全部取出),获得对应的二进制 ASCII 码点
- 根据 Base64 码表,每次取出 6 位,换算为对应的 Base64 字符。若不足 6 位,剩余的二进制 ASCII 码点左移补 0。每左移 2 位就在 Base64 编码后增加 1 个
=
示例:将eng
进行 Base64 编码
- 根据 ASCII 码表,
e
的二进制 ASCII 码点为01100101
。 - 根据 ASCII 码表,
n
的二进制 ASCII 码点为01101110
。 - 根据 ASCII 码表,
g
的二进制 ASCII 码点为01100111
。 - 整理获得:
01100101 01101110 01100111
。 - 每次取出 6 位,整理获得:
011001 010110 111001 100111
。 - 根据 Base64 码表,
011001
的 Base64 字符为Z
。 - 根据 Base64 码表,
010110
的 Base64 字符为W
。 - 根据 Base64 码表,
111001
的 Base64 字符为5
。 - 根据 Base64 码表,
100111
的 Base64 字符为n
。 - 整理获得:
ZW5n
。
示例:将en
进行 Base64 编码
- 根据 ASCII 码表,
e
的二进制 ASCII 码点为01100101
。 - 根据 ASCII 码表,
n
的二进制 ASCII 码点为01101110
。 - 整理获得:
01100101 01101110
。 - 每次取出 6 位,整理获得:
011001 010110 1110
。 - 根据 Base64 码表,
011001
的 Base64 字符为Z
。 - 根据 Base64 码表,
010110
的 Base64 字符为W
。 1110
不足 6 位,左移 2 位,获得111000
。- 根据 Base64 码表,
111000
的 Base64 字符为4
。 - 由于左移 2 位,需在 Base64 编码后增加 1 个
=
。 - 整理获得:
ZW4=
。
示例:将e
进行 Base64 编码
- 根据 ASCII 码表,
e
的二进制 ASCII 码点为01100101
。 - 整理获得:
01100101
。 - 每次取出 6 位,整理获得:
011001 01
。 - 根据 Base64 码表,
011001
的 Base64 字符为Z
。 01
不足 6 位,左移 4 位,获得010000
。- 根据 Base64 码表,
010000
的 Base64 字符为Q
。 - 由于左移 4 位,需在 Base64 编码后增加 2 个
=
。 - 整理获得:
ZQ==
。
解码原理
- 根据 Base64 码表,每次取出 4 个 Base64 字符(若不足 4 个,则全部取出),获得对应的二进制 Base64 码点。若有结尾有 n 个
=
,则将最后 1 个 Base64 字符的二进制 Base64 码点右移 2n 位 - 根据 ASCII 码表,每次取出 8 位,换算为对应的 ASCII 字符
示例:将ZW5n
进行 Base64 解码。
- 根据 Base64 码表,
Z
的二进制 Base64 码点为011001
。 - 根据 Base64 码表,
W
的二进制 Base64 码点为010110
。 - 根据 Base64 码表,
5
的二进制 Base64 码点为111001
。 - 根据 Base64 码表,
n
的二进制 Base64 码点为100111
。 - 整理获得:
011001 010110 111001 100111
。 - 每次取出 8 位,整理获得:
01100101 01101110 01100111
。 - 根据 ASCII 码表,
01100101
的 ASCII 字符为e
。 - 根据 ASCII 码表,
01101110
的 ASCII 字符为n
。 - 根据 ASCII 码表,
01100111
的 ASCII 字符为g
。 - 整理获得:
eng
。
示例:将ZW4=
进行 Base64 解码。
- 根据 Base64 码表,
Z
的二进制 Base64 码点为011001
。 - 根据 Base64 码表,
W
的二进制 Base64 码点为010110
。 - 根据 Base64 码表,
4
的二进制 Base64 码点为111000
。 - 由于有 1 个
=
,111000
需要右移 2 位,获得1110
。 - 整理获得:
011001 010110 1110
。 - 每次取出 8 位,整理获得:
01100101 01101110
。 - 根据 ASCII 码表,
01100101
的 ASCII 字符为e
。 - 根据 ASCII 码表,
01101110
的 ASCII 字符为n
。 - 整理获得:
en
。
示例:将ZQ==
进行 Base64 解码。
- 根据 Base64 码表,
Z
的二进制 Base64 码点为011001
。 - 根据 Base64 码表,
Q
的二进制 Base64 码点为010000
。 - 由于有 2 个
=
,010000
需要右移 4 位,获得01
。 - 整理获得:
011001 01
。 - 每次取出 8 位,整理获得:
01100101
。 - 根据 ASCII 码表,
01100101
的 ASCII 字符为e
。 - 整理获得:
e
。
参考资料
本文作者: jsweibo
本文链接: https://jsweibo.github.io/2019/03/04/%E4%BB%80%E4%B9%88%E6%98%AFBase64/
本文对你有帮助?请支持我
- 本文链接: https://jsweibo.github.io/2019/03/04/%E4%BB%80%E4%B9%88%E6%98%AFBase64/
- 版权声明: 除非另有说明,否则本网站上的内容根据署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。