java版base64编码解码类

较早的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;
    }
}

Leave a comment

Your email address will not be published. Required fields are marked *