Base64

原创 2018-04-05 18:54 阅读(122)次

本文参考了:http://blog.xiayf.cn/2016/01/24/base64-encoding/    此文写得很清楚

Base64算法是一种编码方式。

为什么叫base64,因为他使用64个字符来对任意数据进行编码,同理有Base32、Base16编码,当然还有Base58这个比特币用的编码。

这64个字符是各种字符编码(比如ASCII编码)所使用字符的子集,并且可打印。你可以认为这是64个各种编码中通用的字符。

不过由于最后两个字符(即62,63数字对应的字符)"+","/"是 会被url直接转义的符号,因此如果希望通过url传输这些编码字符串,我们需要先做传统base64编码,随后将+和/分别替换为-, _两个字符,在接收端则做相反的动作解码,这种变种叫做Base64 url编码,是Base64的一种变种。

Base64编码本质上是一种将二进制数据转成文本数据的方案。对于非二进制数据,是先将其转换成二进制形式。

把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),然后每连续6比特(2的6次方=64)(在6位的前面补两个0,形成8位一个字节的形式)计算其十进制值,根据该值在64是个字符的索引表中找到对应的字符,最终得到一个文本字符串。

假设我们要对 Hello! 进行Base64编码,按照ASCII表,其转换过程如下图所示:

Hello!的Base64编码结果为 SGVsbG8h

不过问题是原来6个字符被变成了8个字符,长度变长了。

如果最后剩下的字符不到3个字节,则用0填充,输出字符使用'=',因此我们看到Base64末尾会有1到2个'='。

但这里需要注意一个点:Base64编码是每3个原始字符编码成4个字符,如果原始字符串长度不能被3整除,那怎么办?使用0值来补充原始字符串。
以 Hello!! 为例,其转换过程为:

Hello!!的 Base64编码的结果为 SGVsbG8hIQAA 。最后2个零值只是为了Base64编码而补充的,在原始字符中并没有对应的字符,那么Base64编码结果中的最后两个字符 AA 实际不带有效信息,所以需要特殊处理,以免解码错误。标准Base64编码通常用 = 字符来替换最后的 A,即编码结果为 SGVsbG8hIQ==。因为 = 字符并不在Base64编码索引表中,其意义在于结束符号,在Base64解码时遇到 = 时即可知道一个Base64编码字符串结束。

Base64的解码就是编码的反向,去除掉尾部的=,通过64个字符表转变成二进制数,再变成ASCII码和原始字符。

Base64的编码的二进制数长度一定是4的整数倍,在一些特殊应用中,由于=号有其他含义而不在尾部添加,所以需要解码的时候需要补足到4的整数倍。

Base64常用在url传递数据,也用在网页上用来一些较短数据的展示,如小图片,小图片也可以转换成Base64编码

可能会有人在不理解Base64编码的情况下,将其误用于数据加密或数据校验。Base64是一种数据编码方式,目的是让数据符合传输协议的要求。标准Base64编码解码无需额外信息即完全可逆,即使你自己自定义字符集设计一种类Base64的编码方式用于数据加密,在多数场景下也较容易破解。

本文完。

下一篇:Base58,Base58check