Base32 是一种数据编码机制,使用 32 个可打印字符(字母 A-Z 和数字 2-7)对任意字节数据进行编码的方案,编码后的字符串不用区分大小写并排除了容易混淆的字符,可以方便地由人类使用并由计算机处理。
它主要用来把二进制数据编码成可见的字符串。它的编码规则是:任意给定一个二进制数据,以 5 个位(bit))为一组进行切分(注意:base64 以 6 个位 (bit) 为一组),对切分而成的每个组进行编码得到 1 个可见字符。Base32 编码表字符集中的字符总数为 2 的 5 次方 32 个,这也是 Base32 名字的由来。
Base32 将任意字符串按照字节进行切分,并将每个字节对应的二进制值(不足 8 比特高位补 0)串联起来,按照 5 比特一组进行切分,并将每组二进制值转换成十进制来对应 32 个可打印字符中的一个。
由于数据的二进制传输是按照 8 比特一组进行(即一个字节),因此 Base32 按 5 比特切分的二进制数据必须是 40 比特的倍数(5 和 8 的最小公倍数)。
例如输入单字节字符“%”,它对应的二进制值是“100101”,前面补两个 0 变成“00100101”(二进制值不足 8 比特的都要在高位加 0 直到 8 比特),从左侧开始按照5比特切分成两组:“00100”和“101”,后一组不足5比特,则在末尾填充0直到5比特,变成“00100”和“10100”,这两组二进制数分别转换成十进制数,通过上述表格即可找到其对应的可打印字符“E”和“U”,但是这里只用到两组共 10 比特,还差30比特达到 40 比特,按照 5 比特一组还需 6 组,则在末尾填充6个“=”。
填充“=”符号的作用是方便一些程序的标准化运行,大多数情况下不添加也无关紧要,而且,在URL中使用时必须去掉“=”符号。
与 Base64 相比,Base32 具有许多优点:
适合不区分大小写的文件系统,更利于人类口语交流或记忆。
结果可以用作文件名,因为它不包含路径分隔符 “/”等符号。
排除了视觉上容易混淆的字符,因此可以准确的人工录入。例如,RFC4648 符号集忽略了数字“1”、“8”和“0”,因为它们可能与字母“I”,“B”和“O”混淆。
排除填充符号“=”的结果可以包含在 URL 中,而不编码任何字符。
Base32也比Base16有优势:
Base32 比 Base16 占用的空间更小,1000 比特数据 Base32 需要200个字符,而 Base16 则为 250 个字符
Base32的缺点:
Base32 比 Base64 多占用大约 20% 的空间。因为 Base32 使用 8 个 ASCII 字符去编码原数据中的 5 个字节数据,而 Base64 是使用 4 个 ASCII 字符去编码原数据中的 3 个字节数据。
下面将以一个具体的例子说明 Base32 的编码过程。这里以 “Easy” 字符串进行编码,详细步骤如下:
第一步:将字符 “Easy” 取 ASCII 码之后,对其转换成二进制字符串。如下:
E 69 01000101 a 97 01100001 s 115 01110011 y 121 01111001
将上面的字符串拼接得到 “01000101 01100001 01110011 01111001” 长度为 32 的字符串。
第二步:以 5 个 bit 为一组对 “Easy” 字符串对应的二进制串进行切分。得到 “01000,10101,10000,10111,00110,11110,01” 7个字节的 “Easy” 二进制串。
01000 10101 10000 10111 00110 11110 01
注意:每组的二进制串不足 5 个用 0 补齐。
第三步:计算第二步分割的每组二进制串所对应的十进制,然后参考标准 Base32 编码表,找出所对应的编码字符,组合成密文。如下:
01000 01000 I 10101 10101 V 10000 10000 Q 10111 10111 X 00110 00110 G 11110 11110 6 01 01000 I
注意,最后一个分组位数不足 4 个的时候,则用字符 “=” 编码填充,最终得到的 Base32 编码如下:
IVQXG6I=
下面将以一个具体的例子说明 Base32 的编码过程。这里以 “Easy” 字符串进行编码后的“IVQXG6I=”为例,详细步骤如下:
第一步:将编码后的字符串“IVQXG6I=”后面的“=”字符去掉,然后转换成对于的二进制字符串。如下:
00001000 I 00010101 V 00010000 Q 00010111 X 00000110 G 00011110 6 00001000 I
第二步:将每个字符转成二进制字符串前面的三个0去掉,因为在 Base32 中只有 5 位是有效的,其他的是填充的。去掉前面三个位后,如下:
01000 I 10101 V 10000 Q 10111 X 00110 G 11110 6 01000 I
第三步:将解析后二进制一次排列成一个二进制字符串,得到如下字符串:
01000101011000010111001101111001000
将得到的二进制字符串按 8 位分割,剩下的位去掉。如下:
01000101 69 E 01100001 97 a 01110011 115 s 01111001 121 y 000 // 去掉
最后,将得到“Easy”字符串。
查看 Base64 类的详细用法,请参考官网 API 文档,地址如下:
http://commons.apache.org/proper/commons-codec/apidocs/index.html