Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为
字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。什么是可打印字符?在ASCII码中规定,0~31、127这33个字符属
于控制字符,32~126这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。
基于上述文字,下面是我对base64编码的分析理解
(注:以下只考虑base64涉及的编码解码过程,中间过程不予探讨)
- 目的:HTTP是文本协议,我们需要用字符串来表示二进制数据以便HTTP协议解析传输,并且满足传输前后数据一致。
- 约束:传输的字符受限(95个),所以必须使用这95个字符以内的数据来表示二进制数据。
- 思路:寻找一种合适的编码解码方案。
例如:
编码(encode)时,将二进制数据 '01 编码成字符 ‘a’。
解码(decode)时,将字符串 ‘a’ 解码成二进制数据 ‘01’。
条件推导:
- 为了编码解码的正确性,我们必须保证二进制单位数据和编码字符的一一映射。
- 由于任意字符类型数量,我们都可以缩小/扩大二进制数据编码单位来与之对应,而字符数量被约束在95个之下,所以我们只能缩小二进制数据编码单位来减小字符串种类来保证一一映射关系。
由此我们必须缩小二进制数据编码单位至95或以下,且因为二进制数据由0/1组成,其编码单位只能是2的指数,所以我们只能选择七位(26 < 95 < 27)以下二进制数据来作为二进制数据编码单位,也就是6/5/4/3/2/1位二进制来和26/25/24/23/22/21种字符来进行一一映射。
也就是说,我们必须选择[1,6]以内的二进制位数,如果我们选择每1位二进制都编码成一个字符,那么编码结果只有二种字符类型,编码解码效率相当快。但是每个字节就会被编码成八个字符,加大了传输量。为了减少传输量,我们选择每6位编码成一个字符,那么编码结果就有64种字符类型,每个字节使用1.33~个字符表示,每3个字节使用4个字符表示,最大化的减小了传输量,这也就是base64的由来。当我们解码时,会把每个字符解码成对应的6位二进制数据,进而实现了编码前和编码解码后数据的一致性。