Base64是网络上最多见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。前端
因为HTTP协议是文本协议,因此在HTTP协议下传输二进制数据须要将二进制数据转换为字符数据。然而直接转换是不行的。由于网络传输只能传输可打印字符。安全
问: 什么是“可打印字符”呢?
答: 在ASCII码中规定,0~3一、128这33个字符属于控制字符,32~127这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符没法传输。网络
问: 那么该怎么才能传输其余字符呢?
答: 其中一种方式就是使用Base64。Base64通常用于在HTTP协议下传输二进制数据。编码
Base64的索引与对应字符的关系以下表所示:加密
也就是说,若是将索引转换为对应的二进制数据的话须要至多6个Bit(2^6=64)。然而ASCII码须要8个Bit来表示,那么怎么使用6个Bit来表示8个Bit的数据呢?6个Bit固然不能存储8个Bit的数据,可是4*6个Bit能够存储3*8个Bit的数据啊!spa
能够看到“Son”经过Base64编码转换成了“U29u”。这是刚恰好的状况,3个ASCII字符恰好转换成对应的4个Base64字符。可是,当须要转换的字符数不是3的倍数的状况下该怎么办呢?Base64规定,当须要转换的字符不是3的倍数时,一概采用补0的方式凑足3的倍数,具体以下表所示:code
每6个Bit为一组,第一组转换后为字符“U”,第二组末尾补4个0转换后为字符“w”。剩下的使用“=”替代。即字符“S”经过Base64编码后为“Uw==”。这就是Base64的编码过程。对象
好了,原理懂了,那么若是要进行base64编码,咱们该怎么作呢?本身撸一个方法?找一个库?都行,可是HTML规范中已经规定了base64转换的API,window对象上能够访问到base64编码和解码的方法,直接调用便可。
window.atob() // 对base64编码过的字符串进行解码
window.btoa() // 对ASCII编码的字符串进行base64编码(不支持汉字,汉字可经过URIencode预处理后再编码)索引
注意:图片