Base64 是一种基于 64 个可打印字符来示意二进制数据的示意办法。因为 2 的 6 次方等于 64,所以每 6 个比特为一个单元,对应某个可打印字符。三个字节有 24 个比特,对应于 4 个 Base64 单元,即 3 个字节可示意 4 个可打印字符。它可用来作为电子邮件的传输编码。在 Base64 中的可打印字符包含字母 A -Z、a-z、数字 0 -9,这样共有 62 个字符,此外两个可打印符号在不同的零碎中而不同。一些如 uuencode 的其余编码方法,和之后 binhex 的版本应用不同的 64 字符集来代表 6 个二进制数字,然而它们不叫 Base64。
起因
计算机以二进制模式(0 和 1)进行通信,然而人们通常心愿与更丰盛的表单数据(例如文本或图像)进行通信。为了在计算机之间传输此数据,首先必须将其编码为 0 和 1,而后发送,而后再次解码。以文本为例 - 有许多不同的办法能够执行此编码。如果咱们都能够批准一个编码,那就简略得多了,但可怜的是事实并非如此。
最后创立了许多不同的编码(例如 Baudot 码),每个字符应用不同数量的位,直到最终 ASCII 成为每个字符 7 位的规范。然而,大多数计算机将二进制数据存储在每个字节由 8 位组成的字节中,因而 ASCII 不适宜传输此类数据。有些零碎甚至会擦除最高位。此外,跨零碎的行尾编码的差别意味着有时还会批改 ASCII 字符 10 和 13。
为了解决这些问题,引入了 Base64 编码。这样,您就能够将框架字节编码为已知能够平安发送而不损坏的字节(ASCII 字母数字字符和几个符号)。毛病是应用 Base64 编码音讯会减少其长度 - 每 3 个字节的数据会编码为 4 个 ASCII 字符。
为了牢靠地发送文本,您能够首先应用所选的文本编码(例如 UTF-8)将其编码为字节,而后再对 Base64 进行编码,将生成的二进制数据编码为可平安发送为 ASCII 的文本字符串。接收者将不得不逆转此过程以复原原始音讯。当然,这要求接收者晓得应用了哪种编码,并且该信息通常须要独自发送。
从历史上看,它已用于对电子邮件中的二进制数据进行编码,其中电子邮件服务器可能会批改行尾。一个更古代的示例是应用 Base64 编码将图像数据间接嵌入 HTML 源代码中。在这里,有必要对数据进行编码,以防止像“<”和“>”这样的字符被解释为标签。
原理
base64 加密原理,是将待转换字符串转换为二进制并以三个字为一组(数据有余用 0 补足),每 6 位为一个索引组转换为十进制索引,通过索引在 base64 索引表中找到对应的字符作为编码后的字符(若原数据长度不是 3 的倍数时则对 3 取余余数为 1,则在编码后果后加 2 个 =;若余数为 2,则在编码后果后加 1 个 =。)。
base64 转换实例
以 helloworld 为例转换过程如下:
通过上述步骤转后字符串为:aGVsbG93d29ybGQ=,到此一个残缺的转码例子便实现了。
利用
base64 在须要网络通讯的场景下,有着十分宽泛的利用场景,比方邮件的附件和图象传输,html img
标签的 src 属性也能够是 base64 编码的图片,还有咱们罕用的各类证书 (领取证书,ssl 证书) 的公钥和私钥..
Summary
base64 是一个很优良的编码方式,他很好的解决了简单文件在传输中的问题,也因而被宽泛的利用在各种场景之中。对于 base64 的应用,你还须要晓得如下几点:
- base64 转码后的长度会有所变动,会比源数据的长度多出大概 1/3
- base64 不具备加密个性,因而他不适用于加密的场景
- 因为 base64 字符中会有 +,/ 等字符,因而如果须要 url 传参的时候留神须要应用 URL 编码一下,否则有可能会导致承受到的数据无奈失常解密的状况
References
维基百科
Why do we use Base64?
What is base 64 encoding used for?