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?