什么是Base64算法?——全⽹最详细讲解
什么是Base64算法?
⼀、何为Base64算法
Base64是⼀种基于64个可打印字符来表⽰的表⽰⽅法。由于,所以每6个为⼀个单元,对应某个可打印字符。3个有24个⽐特,对应于4个Base64单元,即3个字节可由4个可打印字符来表⽰。它可⽤来作为的传输。在Base64中的可打印字符包括A-Z、a-z、0-9,这样共有62个字符,此外两个可打印符号在不同的系统中⽽不同。
Base64常⽤于在通常处理⽂本的场合,表⽰、传输、存储⼀些⼆进制数据,包括的及的⼀些复杂数据。
⼆、Base64算法是如何设计的
在不同的实现中,Base64算法中由64个字符组成的字符集是不⼀样的。但是通常的实现⽅法是选择64个通⽤且能打印的字符来组成这样⼀个集合。且要保证这个集合中的每个字符组成的数据在数据传输系统中不会被修改。
早期的Base64算法是⽤来实现运⾏相同操作系统之间进⾏拨号操作⽽创建的。
让我们先来看⼀下最通常的Base64索引表:
ascii文字是啥Bas64算法的实现
接下来,我们将使⽤ASCII⽂本来作为例⼦讲解,但是这并不是Base64最主流的⽤法。Base64算法⽣成的字符串可以安全地在任何实现了Base64算法的计算机之间传输。Base64典型的⽤途是给⼆进制数据(例如:图⽚⽂件)进⾏编码的,我们为了简化,就不⽤⼆进制,⽽是使⽤⼀段ASCII⽂本字符串来作为例⼦进⾏讲解。Base64编码出来的数据只会包含最多64种不同的ASCII字符,因此,使⽤Base64算法,我们就能避免数据在部分系统传输过程中发⽣改变。
例如,下⾯是⼀段ASCII⽂本组成的名⾔,我们将⽤这段名⾔来作为需要编码的输⼊样例:
Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
我们可以先使⽤⼀些在线的Base64编码⼯具对这段⽂字进⾏Base64编码,这⾥推荐站长⼯具⽹上的Base64加密解密⼯具:我们对这段⽂本进⾏Base64编码后,得到的字符串为:
⾸先,我们发现字符串“Man”的Base64编码是“TWFu”,那么这是怎么转换过来的呢?不急,我们⼀个⼀个字符来分析,⾸先对于“M”来说,"M"对应的ASCII编码是77,⼆进制形式即01001101;同理,字符“a”对应的ASCII编码是97,⼆进制表现形式为01100001;“n”的ASCII编码为110,⼆进制形式为:01101110。(ASCII编码表可参考:)这三个字符的⼆进制位组合在⼀起就变成了⼀个24位的字符串“010011010110000101101110”,接下来,我们从左⾄右,每次抽取6位作为1组(因为6位⼀共有
2^6=64种不同的组合),因此每⼀组的6位⼜代表⼀个数字(0~63),接下来,我们查看索引表,到这个数字对应的字符,就是我们最后的结果,是不是很简单呢?
例如下图所⽰,可能会看的更加明⽩⼀些:
24位字符串:“010011010110000101101110”的第⼀组6位数是“010011”,对应的⼗进制数是19,我们查索引表发现,19对应的字符是“T”,因此,第⼀组6位数对应的字符就是“T”;同理,第⼆组6位数
是“010110”,对应的⼗进制数是22,查索引表,22对应的字符是“W”;同理,第三组6位数是“000101”,对应的⼗进制是5,查表得,5对应的字符是“F”;同理,第四组6位数是“101110”,对应的⼗进制是46,查表得,46对应的字符是“F”。到此,“Man”字符串的编码就完成了,不相信的同学可以去上述的Base64在线加密⽹站亲⾃试⼀试。我们发现,3个ASCII字符,⼀共24位,最后编码成了4个ASCII字符,32位。因此,从24位到32位的转变,使得Base64编码的结果要⽐原来的值变得更⼤,且⼤1/3。因此,Base64编码实质上就是把⼀个个24⽐特位组成的⼆进制组合转换成32⽐特位组成的⼆进制组合。
当然,如果思考的周密的同学肯定会想到,万⼀我只有2个ASCII字符需要进⾏Base64编码,这两个字符⼀共才16位,并不是6的倍数啊!并且也不够24位啊!那怎么分组呢?不够分啊,即使第⼀组占前6位,第⼆组占6位,剩下的4位也不够凑成⼀组啊!并且还有最后6位怎么办?
不急,Base64的设计者早就想到了这⼀点,如若是少了“位”,即使⽤0填充。若是少了⼀组,直接⽤“=”代替。
例如,我们假设需要编码的字符串为“Ma”,我们把他们转换为相应的⼆进制:
⾸先,仍然是⽼规矩:第⼀组6位数是“010011”,对应的⼗进制数是19,我们查索引表发现,19对应的字符是“T”;第⼆组6位数是“010011”,对应的⼗进制数是22,我们查索引表发现,19对应的字符是“W”,第三组。。。。哦,第三组貌似不够6位啊,只有4位,那么剩下的2位⾃动填充为0,则第三组6位数是“000100”,对应的⼗进制数是4,我们查索引表发现,4对应的字符是“E”,但是我们发现,最后6位根本啥都没有啊!不要急,对于这种情况,我们直接⽤“=”代替空的6个⽐特位。
因此,"Ma"的Base64编码结果就是“TWE=”,不信可以亲⾃试试(注意⼤⼩写):。
既然3个字符(24位)才够转换为4个6位的分组。那么如果我只有1个ASCII字符怎么办呢?例如,我们对字符“M”进⾏Base64编码操作:
同理,字符“M”只有8位,根本不够24位凑成⼀组。那么我们仍然先来解析第⼀组的6位,第⼀组6位数是“010011”,对应的⼗进制数是19,我们查索引表发现,19对应的字符是“T”,第⼆组只有2位,剩下的4位按照⽼规矩置0,则第⼆组6位数
是“010000”,对应的⼗进制数是16,我们查索引表发现,16对应的字符是“Q”,第3组没有任何⼆进制位,直接⽤“=”代替,同理,第4组也没有任何⼆进制位,⽤“=”代替。
因此,"Ma"的Base64编码结果就是“TQ==”,不信可以亲⾃试试(注意⼤⼩写):。
基于“=”的填充机制,我们可以通过观察Base64编码的字符串最后有⼏个“=”来判断最后⼀组24位中有⼏个“填充字节”。
如果有1个“==”,则最后1组包含2个ASCII字符。如果有两个“=”,则最后⼀组只包含1个ASCII字符。
因此,通过这样的Base64转换,我们可以得到这样的⼀个结论:Base64的输出与输⼊⽐是4:3。特别的,当输⼊是n个字节时(1个字节等于8位),输出会是(4/3)*n个字节。
理论上来说,当我们对Base64进⾏解码时,填充符号“=”是不⽤考虑进去的。但是在⼀些实现中,填充符号“=”是必须的,⼀种情况是连接多个Base64编码的字符串,如果不使⽤填充字符“=”,则在解码时将会发⽣错误。
接下来,我们在看⼀段动画演⽰上述的完整编码过程:(点击全屏观看)
参考资料
【1】——Base64编码
⽂章版权声明
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论