base64编码

base64编码可以表示任意的八位字节。他的字符集取自US-ASCII,一共64个可打印字符,外加一个=符号用于可选的填充位。

base64编码规则

为什么base64编码会有填充位?

这和base64的编码要求有关,通过将二进制的数据每24位(3个字节)做一次分割,转为每组6位的4个小单元。 这四个小单元,在表示范围上,正好可以表示2^6=64中情况。由于每个字节是8位的,我们把这4组小单元高位补上两个0,每个小单便是一个新的字节,可以对应到basee64码表中的一个字符。

当数据不够24位时,就需要补位,不够24位的几种情况可以枚举出来:

  1. 按6位分组后,不够6位的,统一在右侧补'0'
  2. 得到补全的的分组数据后,当最后一段正好是24倍数,那么没有=
  3. 最后一段只有16位,需补一个=
  4. 最后一段只有8位,需补两个=

同时每一行的字符不超过76个,也就是第77个就要换行。解码过程中忽略所有的换行和其他不在码表内的字符;

base64字符集

base64的码表可以参考RFC协议标准。根据rcf2045,rcf3548的定义,固定的字符集如下,为了解决在url中+与/的转义,用-和_替代。

我们把字符集全部枚举后可以得到下图:

base64 map

base64编码样例

base64的转义过程基本如下,可以总结为一些步骤:

* base64的编码都是按字符串长度,以每3个8bit的字符为一组
* 针对每组,首先获取每个字符的ASCII编码值
* 将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节
* 再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节
* 将这4个8bit的字节转换成10进制,对照Base64编码表,得到对应编码后的字符

以字符串ABC为例,编码过后的密文是QUJD,转换过程如下:

base64 sample

如果对字符串ABCD,得到的就是QUJDRA==,可以看到最后补了两位=,他命中的情况是最后一段只有8位

针对缺失补位的样例,可以直接参考Wiki上的'Man'示例:

base64 fill zero

base64 padding

base64解码

TODO

base64编/解码工具

各种语言都有base64编解码的工具,有些甚至有多重实现,比如Java有Android版本,有Java版本,有Okhttp的版本。

快速编解码,也可以通过在线工具: http://www.miraclesalad.com/webtools/base64.php

参考

powered by Gitbook最近更新 2018-09-11

results matching ""

    No results matching ""