base64编码
base64编码可以表示任意的八位字节。他的字符集取自US-ASCII,一共64个可打印字符,外加一个=
符号用于可选的填充位。
base64编码规则
为什么base64编码会有填充位?
这和base64的编码要求有关,通过将二进制的数据每24位(3个字节)做一次分割,转为每组6位的4个小单元。
这四个小单元,在表示范围上,正好可以表示2^6=64
中情况。由于每个字节是8位的,我们把这4组小单元高位补上两个0,每个小单便是一个新的字节,可以对应到basee64码表中的一个字符。
当数据不够24位时,就需要补位,不够24位的几种情况可以枚举出来:
- 按6位分组后,不够6位的,统一在右侧补'0'
- 得到补全的的分组数据后,当最后一段正好是24倍数,那么没有=
- 最后一段只有16位,需补一个=
- 最后一段只有8位,需补两个=
同时每一行的字符不超过76个,也就是第77个就要换行。解码过程中忽略所有的换行和其他不在码表内的字符;
base64字符集
base64的码表可以参考RFC协议标准。根据rcf2045,rcf3548的定义,固定的字符集如下,为了解决在url中+与/
的转义,用-和_
替代。
我们把字符集全部枚举后可以得到下图:
base64编码样例
base64的转义过程基本如下,可以总结为一些步骤:
* base64的编码都是按字符串长度,以每3个8bit的字符为一组
* 针对每组,首先获取每个字符的ASCII编码值
* 将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节
* 再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节
* 将这4个8bit的字节转换成10进制,对照Base64编码表,得到对应编码后的字符
以字符串ABC
为例,编码过后的密文是QUJD
,转换过程如下:
如果对字符串ABCD
,得到的就是QUJDRA==
,可以看到最后补了两位=,他命中的情况是最后一段只有8位
针对缺失补位的样例,可以直接参考Wiki上的'Man'示例:
base64解码
TODO
base64编/解码工具
各种语言都有base64编解码的工具,有些甚至有多重实现,比如Java有Android版本,有Java版本,有Okhttp的版本。
快速编解码,也可以通过在线工具: http://www.miraclesalad.com/webtools/base64.php