前言:数据结构和算法是广大程序猿的痛点,当然对我来说也是,所以这段时间我自己也是在狂补数据结构和算法相关的知识,因为个人对数据结构和算法研究不是很深入,基本在学习的过程都是借鉴别人的博客以及自己购买的学习课程。从深度来说,是远远不够的,如果您阅读这系列博客觉得都太简单小儿科,可以将您深入的理解投稿给我,分享给积极学习的小伙伴们。但我相信,这些内容对绝大多数人都是不可多得的好材料。在写文章的时候我会把具体借鉴的文章地址做说明,如果是相关课程的话,我会给出具体课程所在位置以及购买的邀请码。
几年前面试的时候,数据结构和算法基本都是不问的,但是这几年随着程序猿数量的增加,互联网红利的下滑,面试越来越严格,要求也越来越高。源码+数据结构+算法都是家常便饭啦。对于有跳槽想法的你我,及时的补充数据结构和算法知识可是迫在眉睫的事情。
第一篇我们来一起认识一下Base64的前世今生。
参照”程序员小灰”公众号关于Base64讲解的文章
1. ASCII码的原理
为什么要说ASCII码呢,因为出现Base64和这个是有所关联。
ASCII的范围是0127,总共是128个字符,其中031和127这33个字符属于控制字符,剩下的32~126这95个字符属于可打印字符,包含数字、大小写字母和常用符号。
在早期的一些传输协议,例如传输邮件的SMTP协议,只能传输可打印的ASCII字符。导致原本8Bit字节码(0~255)超出了可用的范围。比如邮件传输图片资源的时候,有一个Byte值是10111011B,对应十进制是187不属于ASCII码的范围,因此无法被传输。
这时候,Base64编码就应运而生啦。具体Base64是如何解决的呢?
2. Base64概述
Base64是一种编码算法,为什么叫Base64呢?因为这种算法只支持64个可打印字符。分别是26个大写字符、26个小写字母、10个数字以及+
和/
两个字符。
Base64巧妙的使用6Bit字符表示原本的8Bit字符,这样可以将字符控制在可打印的范围内,可以囊括原本ASCII码中所有的字符。甚至可以将ASCII码之外的字符都转换成可打印的6Bit字符。
那到底是怎么将原本字节码是8Bit转换成成6Bit的呢?
3. Base64转换原理
Base64转换到底是怎么完成的呢?我们都知道8和6的最小公倍数是24,这样就可以使用4个Base64字符来表示3个传统的8Bit字符。这样有点抽象,且看下面的图片:
从图中可以知道,将原来的数据按照8Bit排列,然后用6Bit来截取,将截取的数据转换成10进制,这样就可以在Base64表中找到对应的字符。
这个例子是理想状态,如果原字符个数不是3个,而是4个,这个时候对应的8Bit位数就是32,不是最小公倍数的倍数,此时就需要使用0进行补位,补位后的位数必须是24的倍数,32加上8不能满足要求,只能是加上16,这样就可以啦,但是对应后两位都是0,这个时候就用=
来替代,如下图:
通过这一个操作就可以看出来,为什么Base64加密后经常在编码后的字符串后面出现=
啦。
4. Base64表
Base64对照表和ASCII的对照表不一样,这里需要注意一下,Base64对照表如下: