之前研究过 base64 编码,但是 blog 一直放着没写,现在把它完结了吧~
引言
base64 是一种简单又常用的编码方式,通常用于传输一些数据(可以是文本也可以是图片)。
之前在工作中,有看到相关的应用,有点好奇它的原理,就分析了一下。
规则
简而言之,base64 编码的过程就是将源字符串每 3 个字符扩展为 4 个编码表字符,从而组成一个新的字符串,其中 3 个字符对应 24 位,若取 6 位为一个编码字符,则正好对应 4 个字符。如果剩下的字符不足 3 个字符,那么就用“=”进行替代,所以,base64 编码后的字符串,可能会出现 0 个、1 个或 2 个“=”。
从这里也可以看出,因为是按 6 位进行编码的,所以这也是叫 base64 的由来😂。
对应的编码表:
码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 |
---|---|---|---|---|---|---|---|
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 | / |
有了编码表之后,就可以进行编码操作了,以“A”这个单字符组成的字符串为例,字符“A”的二进制形式为:
取出前六位:
按照编码表就等于:
这样,就得到了编码后的第一个字符。但此时会发现,字符“A”还剩下“01”两位没有用到,这里直接在后面补零就好,可得0100 00
这六位,对应编码同样还是Q
。
这时,得到了由Q
这个字符构成的字符串QQ
,离目标 4 个字符还差两个,这里再直接用“=”补齐,就得到:QQ==
这个编码后的字符串了。
整体来看,编码过程并不复杂,对吧,下面再来实现它。
编码
考虑到整个编码过程中,存在着大量的取位操作,直接使用位运算取出特定的位,然后根据编码表转换为特定的字符会比较方便,所以我们直接使用 C 语言的位运算来实现,测试代码如下:
1 |
|
解码
学会如何编码之后,对应的解码自然也不在话下了,只需要按照对应的解码表进行解码即可,我们直接在上面的代码中修改:
1 |
|
结语
这篇文章重点分析了 base64 编码、解码的过程,并用 C 语言简单实现了一个 demo 程序。总体来看,base64 编码的过程并不复杂,作为理解计算机编码方式的练习来讲,还不错。
PS:欠了一年的 blog 终于水完了~😂