BASE64編碼(網絡機器人JAVA編程指南學習)

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)

代碼中得四行輸出即爲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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章