关于Base64编码规则详情请看这里:
http://baike.baidu.com/view/469071.htm
代码实现:
/**
* 实现Base64的编码以及解码;
* @author dell
*
*/
public class SelfBase64 {
/**
* 码表;
*/
public static char[] encodeTable={'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', '+', '/'};
/**
* Base64的编码;
* @param value
* @return
*/
public static String encoderBase64(byte[] value){
StringBuilder sb=new StringBuilder();
//获取编码字节是3的倍数;
int len=value.length;
int len3=len/3;
//先处理没有加换行符;
for(int i=0;i<len3;i++){
//得到第一个字符;
int b1=(value[i*3]>>2)&0x3F;
char c1=encodeTable[b1];
sb.append(c1);
//得到第二个字符;
int b2=((value[i*3]<<4&0x3F)+(value[i*3+1]>>4))&0x3F;
char c2=encodeTable[b2];
sb.append(c2);
//得到第三个字符;
int b3=((value[i*3+1]<<2&0x3C)+(value[i*3+2]>>6))&0x3F;
char c3=encodeTable[b3];
sb.append(c3);
//得到第四个字符;
int b4=value[i*3+2]&0x3F;
char c4=encodeTable[b4];
sb.append(c4);
}
//如果有剩余的字符就补0;
//剩余的个数;
int less=len%3;
if(less==1){//剩余一个字符--补充两个等号;;
//得到第一个字符;
int b1=value[len3*3]>>2&0x3F;
char c1=encodeTable[b1];
sb.append(c1);
//得到第二个字符;
int b2=(value[len3*3]<<4&0x30)&0x3F;
char c2=encodeTable[b2];
sb.append(c2);
sb.append("==");
}else if(less==2){//剩余两个字符--补充一个等号;
//得到第一个字符;
int b1=value[len3*3]>>2&0x3F;
char c1=encodeTable[b1];
sb.append(c1);
//得到第二个字符;
int b2=((value[len3*3]<<4&0x30)+(value[len3*3+1]>>4))&0x3F;
char c2=encodeTable[b2];
sb.append(c2);
//得到第三个字符;
int b3=(value[len3*3+1]<<2&0x3C)&0x3F;
char c3=encodeTable[b3];
sb.append(c3);
sb.append("=");
}
return sb.toString();
}
/**
* Base64的解码;
* @param value
* @return
*/
public static String decoderBase64(byte[] value){
//每四个一组进行解码;
int len=value.length;
int len4=len/4;
StringBuilder sb=new StringBuilder();
//除去末尾的四个可能特殊的字符;
int i=0;
for(i=0;i<len4-1;i++){
//第一个字符;
byte b1=(byte) ((char2Index((char)value[i*4])<<2)+(char2Index((char)value[i*4+1])>>4));
sb.append((char)b1);
//第二个字符;
byte b2=(byte) ((char2Index((char)value[i*4+1])<<4)
+(char2Index((char)value[i*4+2])>>2));
sb.append((char)b2);
//第三个字符;
byte b3=(byte) ((char2Index((char)value[i*4+2])<<6)+(char2Index((char)value[i*4+3])));
sb.append((char)b3);
}
//处理最后的四个字符串;
for(int j=0;j<3;j++){
int index=i*4+j;
if((char)value[index+1]!='='){
if(j==0){
byte b=(byte) ((char2Index((char)value[index])<<2)
+(char2Index((char)value[index+1])>>4));
System.out.println(">>>>>>"+b);
sb.append((char)b);
}else if(j==1){
byte b=(byte) ((char2Index((char)value[index])<<4)
+(char2Index((char)value[index+1])>>2));
System.out.println(">>>>>>"+b);
sb.append((char)b);
}else if(j==2){
byte b=(byte) ((char2Index((char)value[index])<<6)
+(char2Index((char)value[index+1])));
System.out.println(">>>>>>"+b);
sb.append((char)b);
}
}else{
break;
}
}
return sb.toString();
}
/**
* 将码表中的字符映射到索引值;
* @param ch
* @return
*/
public static int char2Index(char ch){
if(ch>='A'&&ch<='Z'){
return ch-'A';
}else if(ch>='a'&&ch<='z'){
return 26+ch-'a';
}else if(ch>='0'&&ch<='9'){
return 52+ch-'0';
}else if(ch=='+'){
return 62;
}else if(ch=='/'){
return 63;
}
return 0;
}
}
注意在电子邮件中编码时每76个字符需要加回车换行符,此时修改代码如下:
/**
* 电子邮件中的base64编码方式;
* @param value
* @return
*/
public static String encodeEmailBase64(byte[] value){
//每76个字符需要加上一个换行符;
String v=new String(value);
StringBuilder sb = new StringBuilder();
int len=value.length;
int len76=len/76;
int i=0;
for(i=0;i<len76;i++){
sb.append(v.substring(i*76, i*76+76));
sb.append("\r\n");
}
sb.append(v.substring(i*76));
return encoderBase64(sb.toString().getBytes());
}
/**
* 电子邮件中的base64解码方式;
* @param value
* @return
*/
public static String decoderEmailBase64(byte[] value){
//解密之后去掉回车换行符;
String decResult=decoderBase64(value);
String result=decResult.replaceAll("\r\n", " ");
return result;
}