背景
本文主要是研究一下文本编码为 Base64 以及解码的主要过程以及原理,简单知道一下其中的原理。
Base64 的基本介绍
以下的介绍摘抄自维基百科:
Base64(基底64)是一种基于 64 个可打印字符来表示二进制数据的表示方法。由于log264=6
,所以每 6 个比特为一个单元,对应某个可打印字符。3 个字节相当于24个比特,对应于4个Base64单元,即 3 个字节可由 4 个可打印字符来表示。在Base64中的可打印字符包括字母 A-Z、a-z、数字 0-9,这样共有 62 个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后 BinHex 的版本使用不同的 64 字符集来代表 6 个二进制数字,但是不被称为Base64。
从以上的介绍中我们得出以下的一些信息
1、首先是基于 64 个可打印的字符,这些字符包含了以下的内容,我这里直接搬运维基百科的索引表。
| 十进制 | 二进制 | 字符 | 十进制 | 二进制 | 字符 | 十进制 | 二进制 | 字符 | 十进制 | 二进制 | 字符 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 000000 | A | 16 | 010000 | Q | 32 | 100000 | g | 48 | 110000 | w |
| 1 | 000001 | B | 17 | 010001 | R | 33 | 100001 | h | 49 | 110001 | x |
| 2 | 000010 | C | 18 | 010010 | S | 34 | 100010 | i | 50 | 110010 | y |
| 3 | 000011 | D | 19 | 010011 | T | 35 | 100011 | j | 51 | 110011 | z |
| 4 | 000100 | E | 20 | 010100 | U | 36 | 100100 | k | 52 | 110100 | 0 |
| 5 | 000101 | F | 21 | 010101 | V | 37 | 100101 | l | 53 | 110101 | 1 |
| 6 | 000110 | G | 22 | 010110 | W | 38 | 100110 | m | 54 | 110110 | 2 |
| 7 | 000111 | H | 23 | 010111 | X | 39 | 100111 | n | 55 | 110111 | 3 |
| 8 | 001000 | I | 24 | 011000 | Y | 40 | 101000 | o | 56 | 111000 | 4 |
| 9 | 001001 | J | 25 | 011001 | Z | 41 | 101001 | p | 57 | 111001 | 5 |
| 10 | 001010 | K | 26 | 011010 | a | 42 | 101010 | q | 58 | 111010 | 6 |
| 11 | 001011 | L | 27 | 011011 | b | 43 | 101011 | r | 59 | 111011 | 7 |
| 12 | 001100 | M | 28 | 011100 | c | 44 | 101100 | s | 60 | 111100 | 8 |
| 13 | 001101 | N | 29 | 011101 | d | 45 | 101101 | t | 61 | 111101 | 9 |
| 14 | 001110 | O | 30 | 011110 | e | 46 | 101110 | u | 62 | 111110 | + |
| 15 | 001111 | P | 31 | 011111 | f | 47 | 101111 | v | 63 | 111111 | / |
| 填充 | = |
2、Base64 以 3 个字节为一个单元表示一个字符;
3、具有填充的行为,使用 = 进行填充,因为三个字节由 4 个可打印字符表示,如果不够的话就会用 = 进行填充。
实战转换
例如我们期望转换 ‘Hello World’ 这个字符串,过程如下:
首先需要将每一个字符转换成二进制,再对照索引表查看具体对应值。
# H e l l o W o r l d
# 第一步:首先找到每个字母对应的 ASCII 码具体值
H 72
e 101
l 108
l 108
o 111
space 32
W 87
o 111
r 114
l 108
d 100
# 第二步:将对应的 ASCII 值转换成 8 位的二进制值,如果其不是 8 位的需要再前面补上 0
# 对应二进制如下,当然不足 8 位的话需要之前补齐,补充 0 即可
01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100
# 第三步:切割数据,每 6 位做为一个单位,
010010 000110 010101 101100 011011 000110 111100 100000 010101 110110 111101 110010 011011 000110 010000
# 第四步:对照着索引表找到对应的值
010010 ——> S
000110 --> G
010101 --> V
101100 --> s
s01101 --> b
100011 --> G
011110 --> 8
010000 --> g
010101 --> V
110110 --> 2
111101 --> 9
011001 --> y
001101 --> b
100011 --> G
001000 --> Q
# 整体下来就是如下的字符串
SGVsbG8gV29ybGQ
# 但是还有一个比较重要的事情,这个字符串需要每四个算作一组,不够的话需要补齐,补齐的话就用=。
SGVs bG8g V29y bGQ=
# 最终结果如下
SGVs bG8g V29y bGQ=
在命令行中查看结果:
参考文档
维基百科Base64 zh.wikipedia.org/wiki/Base64
ASCII 码对照表 tool.oschina.net/commons?typ…
字符串转 Base64 www.lddgo.net/convert/str…
在线进制转换 tool.oschina.net/hexconvert