1. 为什么需要Base64编码?
- 随着Internet的发展,电子邮件不仅仅是交换文本信息,而是用图像、音频、视频、附件等形式传递更加丰富的多媒体信息。但这些多媒体信息是非ASCII码的二进制数据,使用邮件格式标准RFC822邮件格式发送这些多媒体信息数据时,由于网络传输只能传输可打印字符,故需要采用编码解码方式将其进行“编码”成可打印的字符再进行传输,再进行解码出原始的二进制数据。针对该需要,人们定义了电子邮件技术规范MIME协议(多用途互联网邮件扩展Multipurpose Internet Mail Extensions),在改变SMTP协议和RFC822的基础上,使得邮件可以传送任意二进制文件。
- 随着电子邮件用户增加,像中文、日文等字符不能被服务器或网关有效处理。
- 在一个纯文本协议里,二进制信息中可能会有些部分会被当做控制字符处理,引起传输失败。
- 很多较老的协议只支持纯文本(例如SMTP协议)。
- 二进制不兼容,在不同的硬件上(路由器、老电脑上)显示的意义不一样,处理也不一样。
2. Base64编码定义
按照RFC2045的定义,Base64编码被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
Base64编码是基于64个可打印字符来标识二进制数据的方法,将二进制编码成ASCII中64个可打印的字符来传输8bit字节码。编码后的64个字符在大多数机器、软件上的行为是一样的,因此可用于在HTTP环境下传递较长的标识信息。
3. Base64编码的优势
1)编码后的字符串只有[0-9 a-z A-Z + / =],不可打印字符(包括转移字符)也可传输;
2)编码后只会增加字节数,字节数会成为原字节数的4/3;
3)具有不可读性,需要解码后才能阅读;
4)算法可逆, 解码方便, 不用于私密信息通信;
5)算法简单, 几乎不会影响效率;
6)方便打包,可以直接encode成字符串随着代码一起分发;
7)和其他系统对接时,一个字符串经Base64编码解码方便。
4. Base64编码原理 & 过程
思想:基于64个可打印ASCII码字符对二进制数据进行重新编码。
原理:
1)将所有二进制字符转化为64个可打印的ASCII码;
2)将ASCII码转化为8位二进制;
3)将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
4)统一在6位二进制前补两个0凑足8位;
5)将补0后的二进制转为十进制;
6)从Base64编码表获取十进制对应的Base64编码。
过程:
1)拆分:将待转换的字符串数据以每3个byte字节为一组,转换时,将该3个byte的数据先后放入一个24bit的缓冲区中,先来的byte占高位;
2)重排:将拆分得到的这24位数据分为4组,即每组6位(依据:38 = 46 = 24);
3)补 0:重排数据不足3byte时,缓冲区中剩下的bit用 0 补足;
4)处理:每次取出6个bit,并在其前添加两个0,凑成8位。此时得到32位二进制位,即4个字节;
5)查表:根据Base64编码表获得对应的可打印字符。(6bit(原8bit)一个字节,不足的位数用0补齐,两个0用一个 = 表示)
6)不断进行,直到全部待转换的字符串全部转换完成。
- 如果如果最后剩下两个输入数据,在编码结果后加1个“=”;
- 如果最后剩下一个输入数据,编码结果后加2个“=”;
- 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
5. Base64编码表
索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 | 索引 | 对应字符 |
---|---|---|---|---|---|---|---|
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 | ||
15 | P | 32 | g | 49 | x | ||
16 | Q | 33 | h | 50 | y |
6. 编码过程示例
下面分别给 hello! 和 Hello!! 进行Base64编码:
7. 解码原理
Base64解码,即是Base64编码的逆过程。
将Base64编码数据根据编码表分别索引到编码值,然后每4个编码值一组组成一个24位的数据流,解码为3个字符。对于末尾位“=”的base64数据,最终取得的4字节数据,需要去掉“=”再进行转换。