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