Base64 包含以下字符:
“a~z”,“A~Z”,“/”,“+”,“=”(=是做补位用的)
补位规则:
当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。
按(3*8=4*6)每3个8位字节转化为4个6位的字节(高2位补0)的形式;
编码后的字符每76个占一行,至于换行符,Unix系用的LF('\n'),Windows用的是CRLF('\r''\n');
举例:
字符串“张” (HEX:D5 + HEX:C5 )
1) 11010101 11000101
2) 110101 011100 010100(最后补位两个0)
3) 00110101 00011100 00010100
4) 十六进制: 35 1C 14
5) 十进制: 53 28 20
6) 查base64表:’1’ ’c’ ’U’
7) 加补位1位:’1’ ’c’ ’U’ ‘=’
8) 结果:”1cU=”
同理,若原代码只剩下一个字节,那么将会添加两个“=”。只有这两种情况,所以,Base64的编码最多会在编码结尾有两个“=”
注意:补等号是一定的(1个或者2个),第2)步补零需要注意
解码表如下:
static const unsigned charbase64_dec_map[128] =
{
127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
127, 127, 127, 62, 127, 127,127, 63, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 127, 127,
127, 64, 127, 127, 127, 0, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 127, 127, 127, 127, 127, 127, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 127, 127, 127, 127, 127
};
解码表,其中base64_dec_map数组的索引是base64字符串数组元素的ascii码的10进制值。
例如:base64_dec_map中62的索引为:43,正好ascii码表中十进制43对应的是“+”,所以base64编码表中“+”就是62。
解码表没有什么规律,把base64码按照ascii的10进制为索引编码而已。
127可以替换为其他特殊值。