较早的java版本没有直接提供base64编码处理的类,都是通过其他类库的附加功能实现。而对于android平台,又有自己的base64支持类, 导致代码影响跨平台。所以就自己写了个base64编码处理的类,这样就可以同一套代码运行在android平台和se平台了。
package com.hoverlees.utils;
/**
* @author hoverlees http://www.hoverlees.com
* RFC 4648
*/
public class Base64 {
private static char[] base64Table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
private static byte[] base64TableMap=createTableMap();
private static byte[] createTableMap() {
byte[] table=new byte[256];
for(int i=0;i<256;i++) table[i]=-1;
for(int i=0;i<base64Table.length;i++){
table[base64Table[i]]=(byte)i;
}
return table;
}
/**
* Base64编码,将字节数组转换成base64字符串
* @param data 字节数据
* @return base64编码的字符串
*/
public static String encode(byte[] data){
StringBuffer s=new StringBuffer();
int state=0;
int pos=0;
for(int i=0;i<data.length;i++){
switch(pos){
case 0:
state=(data[i]&0xFC)>>2;
s.append(base64Table[state]);
state=(data[i]&0x3)<<4;
pos=1;
break;
case 1:
state|=((data[i]&0xF0)>>4);
s.append(base64Table[state]);
state=(data[i]&0xF)<<2;
pos=2;
break;
case 2:
state|=((data[i]&0xC0)>>6);
s.append(base64Table[state]);
state=data[i]&0x3F;
s.append(base64Table[state]);
pos=0;
break;
}
}
if(pos==1){
s.append(base64Table[state]);
s.append("==");
}
else if(pos==2){
s.append(base64Table[state]);
s.append("=");
}
return s.toString();
}
/**
* Base64解码,将base64字符串转换成字节数组
* @param data base64的字符串
* @return 解码后的字节数组
*/
public static byte[] decode(String data){
byte[] bytes=data.getBytes();
int n=0;
int pos=0;
byte cchar,t;
for(int i=0;i<bytes.length;i++){
cchar=bytes[i];
t=base64TableMap[cchar];
if(cchar=='=') break;
switch(pos){
case 0:
bytes[n]=(byte)(t<<2);
pos=1;
break;
case 1:
bytes[n]=(byte)(bytes[n]|((t&0x30)>>4));
n++;
bytes[n]=(byte)((t&0xf)<<4);
pos=2;
break;
case 2:
bytes[n]=(byte)(bytes[n]|((t&0x3c)>>2));
n++;
bytes[n]=(byte)((t&0x3)<<6);
pos=3;
break;
case 3:
bytes[n]=(byte)(bytes[n]|t);
n++;
pos=0;
break;
}
}
byte[] r=new byte[n];
for(int i=0;i<n;i++) r[i]=bytes[i];
return r;
}
}