A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 大山哥哥 于 2018-2-1 20:12 编辑

        最近发现一些同学在学习中对Base64编码的理解有些模糊,所以在此给这部分同学解释下Base64编码的底层实现。
        要想知道Base64编码,那么首先就得知道什么是编码。编码就是利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式,可以根据算法,再还原回来。举个简单的例子,战争时期大家发电报下达命令肯定都不会直接发明文,因为会被地方电台截取到消息,所以都会把原文用另一种方式表示出来,让敌人看不懂,而己方人员却可以很轻松的把原文还原回来,这就是编码和解码。而Base64就是一种编码的算法,根据这种算法就可以把任意的二进制数据转成特定的字符来表示,那么具体是怎么做的呢,我们来详细说一下。
       首先从名字上来说,Base64就是说这种编码只支持64个可打印字符,包括大小写英文、数字、+、/(一共64个字符)。早期的一些邮件协议,例如SMTP协议,只能传输可打印的字符,导致原本8bit的一个字节(0-255)超出了可表示的范围。例如一个数值是181的数值就超出了可打印字符的范围。这时候,Base64就出现了,它可以使用6bit的字符表示原来8bit才能表示的数值。但是6bit肯定不能直接把8bit的数值全表示出来,所以Base64采取了用4个6bit字符表示3个8bit字符的方式,也就是取6和8的最小公倍数24.这样,就可以用4个Base64字符来表示原来的3个普通字符了。如下图:

        转换的方式就是用原来的字符获取字节,每三个字符转成Base64编码的4个字符,具体转码方式如下:

        可以看出,将原始数据的 每三个字节分为一组,按位进行分割为 每6位一个字节的形式,进行转换,形成新的4个字节。这四个字节才通过Base64编码表进行映射,形成最后实际的Base64编码结果。如果原始数据最后无法凑成3个字节,则补填充,以“=”作为替换,代表没有数据。这样,Base64就用多占用三分之一的空间作为代价,实现了对8bit字符的更好的兼容性。
        下面附上Base64的编码索引表,供大家参考:
        而编码后的数据也可以重新还原为6bit乘以4也就是24bit,然后每8bit重编成一个原来的普通字符,这也就是所谓的解码了。而Base64算法只是对原有的二进制数据重新编码后形成了新的字符串,任何人都可以把编码后的值重新解码成原有的字符串,所以Base64不能作为一种加密算法使用。加密一般使用MD5、SHA、AES、RSA等算法来实现,这些算法篇幅有限,等下次有机会再介绍吧。
        而Base64的应用也非常广泛,例如上文提到了邮件数据的传输中使用。还有就是在客户端和服务器传输图片等二进制数据的时候,可以把图片的二进制数据读成每6bit一个的Base64的字符,然后用字符串进行传输,有些场景下使用更为方便,甚至可以使用这种方式把图片等二进制数据转成字符串存入数据库,不失为一种有效的数据存储方式。
        好了,说了这么多,大家一定大体了解了Base64的底层实现方式和大体用法了,希望能给大家带来一些启发。

1 个回复

倒序浏览
好帖子  写的很详细 顶一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马