黑马程序员技术交流社区
标题: 【济南校区】浅谈Base64编码 [打印本页]
作者: 大山哥哥 时间: 2018-2-1 20:09
标题: 【济南校区】浅谈Base64编码
本帖最后由 大山哥哥 于 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的底层实现方式和大体用法了,希望能给大家带来一些启发。
作者: Yin灬Yan 时间: 2018-2-1 23:57
好帖子 写的很详细 顶一个
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |