Base64编对应表(十进制)
以字符串Spider为例
public class Test1 {
private static char[] toBase64 =
{ 'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/'};
public static void main(String[] args) {
String s="Spider";
byte[] sb=s.getBytes();
int index=0;
int buffer[] = new int[3];
int column=0;
for (int i=0;i<sb.length;i++) {
buffer[index] = sb[i];
index++;
if (index==3) {
System.out.print(toBase64[(buffer[0]&0xfc)>>2]);
System.out.print(toBase64[((buffer[0] &0x03)<<4) |
((buffer[1]&0xf0)>>4)]);
System.out.print(toBase64[((buffer[1]&0x0f)<<2) |
((buffer[2]&0xc0)>>6)]);
System.out.print(toBase64[buffer[2]&0x3f]);
column+=4;
index=0;
if ( column>=76 ) {
System.out.print('\n');
column = 0;
}
}
}
}
}
byte[] sb=s.getBytes();得到字符串Spider的字节数组的十进制ASCII码值
S = 83
p = 112
i = 105
d = 100
e = 101
r = 114
因此,字符串Spider的十进制形式为 83 112 105 100 101 114,我们需要将其转换成二进制形式:
83 = 01010011
112 = 01110000
105 = 01101001
100 = 01100100
101 = 01100101
114 = 01110010
十进制转换成2进制的方法:
int buffer[] = new int[3];创建中间数组,长度为3的原因:
字符串Spider的二进制形式(即以上十进制数83 112 105 100 101 114的二进制顺次连接)为010100110111000001101001011001000110010101110010
而BASE64的编码规定为6位一组,以上分隔为:010100 110111 000001 101001 011001 000110 010101110010
可以发现3个十进制数的二进制形式正好分为4组。(3*8/6=4)
1)第一行输出:toBase64[(buffer[0]&0xfc)>>2]
分析:16进制fc的十进制为0xfc=f*16^1 +c*16^0
= 15*16^1 +12*16^0
= 252
252的二进制为:11111100
其中buffer[0]为S=83 = 01010011
buffer[0]&0xfc
= S & 0xfc
= 83 & 252
= 01010011 & 11111100
0 1 0 1 0 0 1 1
&
1 1 1 1 1 1 0 0
结果 0 1 0 1 0 0 0 0 (按位与:两者都为1结果才为1)
0 1 0 1 0 0 0 0 左移2位(即>>2)最后两位 0 0舍去得0 1 0 1 0 0,所得结果正为分组中的第一组
0 1 0 1 0 0的十进制为2*2^4+2*2^2=20(对应BASE编码表的字符U即toBase64[20])
2)toBase64[((buffer[0] &0x03)<<4) | ((buffer[1]&0xf0)>>4)] 类似第一步分析,需注意的是按位或(|)两者有一个为1即为1