Base64编码

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字节数据,需要去掉“=”再进行转换。



posted @ 2020-08-26 11:05  十一度  阅读(209)  评论(0编辑  收藏  举报