10

什么是base64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

为什么会有base64

由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。

问: 什么是“可打印字符”呢?
答: 在ASCII码中规定,0~31、128这33个字符属于控制字符,32~127这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。

问: 那么该怎么才能传输其他字符呢?
答: 其中一种方式就是使用Base64。Base64一般用于在HTTP协议下传输二进制数据。

base64实现原理

Base64的索引与对应字符的关系如下表所示:
图片描述

也就是说,如果将索引转换为对应的二进制数据的话需要至多6个Bit(2^6=64)。然而ASCII码需要8个Bit来表示,那么怎么使用6个Bit来表示8个Bit的数据呢?6个Bit当然不能存储8个Bit的数据,但是4*6个Bit可以存储3*8个Bit的数据啊!

图片描述

可以看到“Son”通过Base64编码转换成了“U29u”。这是刚刚好的情况,3个ASCII字符刚好转换成对应的4个Base64字符。但是,当需要转换的字符数不是3的倍数的情况下该怎么办呢?Base64规定,当需要转换的字符不是3的倍数时,一律采用补0的方式凑足3的倍数,具体如下表所示:

图片描述

每6个Bit为一组,第一组转换后为字符“U”,第二组末尾补4个0转换后为字符“w”。剩下的使用“=”替代。即字符“S”通过Base64编码后为“Uw==”。这就是Base64的编码过程。

HTML规范关于base64有哪些API

好了,原理懂了,那么如果要进行base64编码,我们该怎么做呢?自己撸一个方法?找一个库?都行,但是HTML规范中已经规定了base64转换的API,window对象上可以访问到base64编码和解码的方法,直接调用即可。
window.atob() // 对base64编码过的字符串进行解码
window.btoa() // 对ASCII编码的字符串进行base64编码(不支持汉字,汉字可通过URIencode预处理后再编码)

base64有哪些应用场景

  1. 前端将较小的icon编码为base64直接在文档中加载,减少http请求
  2. 电子邮件传输二进制文件时,通常用base64编码后再传

注意:

  1. base64编码后的数据量是要比编码前大的,所以base64不能用于减少数据量。
  2. base64不能用于加密数据,即使使用私有的索引表也是不安全的。

水电
534 声望33 粉丝