base64编码
# 一、Base64 由来
base64 最早就是用来邮件传输协议中的,原因是邮件传输协议只支持 ascii 字符传递,因此如果要传输二进制文件,如:图片、视频是无法实现的。因此 base64 就可以用来将二进制文件内容编码为只包含 ascii 字符的内容。
# 二、Base64 的编码原理
首先我们需要明确一点:大多数编码都是由字符串转化成二进制的过程,而 Base64 的编码则是从二进制转换为字符串。正好是逆过程
所以我们的步骤一般是 字符串 -->> 二进制 -->> base64
总结一下具体转换步骤
- 将待转换的字符串每三个字节分为一组,每个字节占 8bit,那么共有 24 个二进制位。
- 将上面的 24 个二进制位每 6 个一组,共分为 4 组。
- 在每组前面添加两个 0,每组由 6 个变为 8 个二进制位,总共 32 个二进制位,即四个字节。
- 根据 Base64 编码对照表(见下图)获得对应的值。
Base64 码表选用了"A-Z、a-z、0-9、+、/" 64 个可打印字符
一个例子
字节不足时怎么处理? 补 =
一个字节:一个字节共 8 个二进制位,依旧按照规则进行分组。此时共 8 个二进制位,每 6 个一组,则第二组缺少 4 位,用 0 补齐,得到两个 Base64 编码,而后面两组没有对应数据,都用“=”补上。因此,上图中“A”转换之后为“TQ==”
从上面的转换过程可以发现:
- Base64 字符表中的字符原本用 6 个 bit 就可以表示,现在前面补上 2 个 0,变为 8 个 bit,会浪费一些空间。因此,Base64 编码之后的文本,要比原文大约三分之一。
- 为什么使用 3 个字节一组呢?因为 6 和 8 的最小公倍数为 24,三个字节正好 24 个二进制位,每 6 个 bit 位一组,恰好能够分为 4 组。
# 三、应用场景
电子邮件(SMTP 协议)这个不多说,就是 base64 出现的原因
http 协议当中的 URL: 必须进行 URLEncode 不然出现的等号可能使解析失败 空格也会使 http 请求解析出现问题,比如 请求行就是以空格来划分的 POST /test HTTP/1.1
图片 base64 编码: 前端在实现页面时,对于一些简单图片,通常会选择将图片内容直接内嵌在页面中,避免不必要的外部资源加载,增大页面加载时间,但是图片数据是二进制数据,该怎么嵌入呢?绝大多数现代浏览器都支持一种名为 Data URLs 的特性,允许使用 Base64 对图片或其他文件的二进制数据进行编码,将其作为文本字符串嵌入网页中。
很多证书一般都是作 Base64 编码的,因为它利于传播和下载。