BASE64编码知识整理

在我们进行互联网应用开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求。 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等。 那么,Base64又到底是什么呢?

base64日常中的应用

下面的这段字符串,应该是大家都很常见的。通过这种固定的格式,来表示一张图片,并被浏览器识别,可以完整的展示出图片:

data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0c......

这里展示的是一个svg格式的图片,当然我们还可以加载任何浏览器支持的格式的图片。

这段字符串就是基于Base64编码得来的,其中base64,后面那一长串的字符串,就是Base64编码字符串。

base64的前世今生

互联网发展早起,电子邮件是最有效的应用。

而电子邮件的SMTP传输协议在早期,只能用于传送7位的ASCII码,而ASCII码就是基于英语设计的,对于非英语国家的文字等资源就无法发送。

为了解决这个问题,后来有了通用互联网邮件扩充MIME,增加了邮件的主体结构,定义了非ASCII码的编码传输规则,这就是Base64。

关于字符编码的知识,请查看前端开发中需要搞懂的字符编码知识

base64基础定义

Base64是基于64个可打印字符来表示二进制数据的编解码方式。 正因为可编解码,所以它主要的作用不在于安全性,而在于让内容能在各个网关间无错的传输。

这64个可打印字符包括大写字母A-Z、小写字母a-z、数字0-9共62个字符,再加上另外2个 + 和 /。

Base64是一种索引编码,每个字符都对应一个索引,具体的关系图,如下:

显而易见基本的64个字符,所以显而易见就base64.

编码方式

由于64等于2的6次方,所以一个Base64字符实际上代表着6个二进制位(bit)。 然而,二进制数据1个字节(byte)对应的是8比特(bit),因此,3字节(3 x 8 = 24比特)的字符串/二进制数据正好可以转换成4个Base64字符(4 x 6 = 24比特)。 为什么是3个字节一组呢? 因为6和8的最小公倍数是24,24比特正好是3个字节。

具体的编码方式:

将每3个字节作为一组,3个字节一共24个二进制位

将这24个二进制位分为4组,每个组有6个二进制位

在每组的6个二进制位前面补两个00,扩展成32个二进制位,即四个字节

每个字节对应的将是一个小于64的数字,即为字符编号

再根据字符索引关系表,每个字符编号对应一个字符,就得到了Base64编码字符

上图中的字符串 'you',经过转换后,得到的编码为: 'eW91'。

= 等号

3个英文字符,正好能转成4个Base64字符。那如果字符长度不是3的倍数,那应该使用什么样的规则呢?

其实也简单,我们在实际使用Base编码时,常会发现有第65个字符的存在,那就是 '=' 符号,这个等于号就是针对这种特殊情况的一种处理方式。

对于不足3个字节的地方,实际都会在后面补0,直到有24个二进制位为止。

但要注意的是,在计算字节数时,会直接使用总长度除以3,如果余数为1则会直接在最后补一个=,如果余数为2则补两个=。

因此,转码后的字符串需要补的后缀等号,要么是1个,要么是2个。

非ASCII码字符

由于 Base64 仅可对 ASCII 字符进行编码,如果是中文字符等非ASCII码,就需要先将中文字符转换为ASCII字符后,再进行编码才行。

评论

(= ̄ω ̄=)··· 暂无内容!

回复

您还未登录,请先登录或者注册