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


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