java base64_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java base64

java base64

 2015/2/4 18:29:21  geniuswxk  程序员俱乐部  我要评论(0)
  • 摘要:importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.OutputStream;importjava.util.Random;importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;publicclassBase64
  • 标签:Java ASE
class="java">

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64 {
	
	
	private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();

	static BASE64Decoder decoder = new BASE64Decoder();
	static BASE64Encoder encoder = new BASE64Encoder();
	
	public static String encode(byte[] data) {
		int start = 0;
		int len = data.length;
		StringBuffer buf = new StringBuffer(data.length * 3 / 2);

		int end = len - 3;
		int i = start;
		int n = 0;

		while (i <= end) {
			int d = ((((int) data[i]) & 0x0ff) << 16)
					| ((((int) data[i + 1]) & 0x0ff) << 8)
					| (((int) data[i + 2]) & 0x0ff);

			buf.append(legalChars[(d >> 18) & 63]);
			buf.append(legalChars[(d >> 12) & 63]);
			buf.append(legalChars[(d >> 6) & 63]);
			buf.append(legalChars[d & 63]);

			i += 3;

			if (n++ >= 14) {
				n = 0;
				buf.append(" ");
			}
		}

		if (i == start + len - 2) {
			int d = ((((int) data[i]) & 0x0ff) << 16)
					| ((((int) data[i + 1]) & 255) << 8);

			buf.append(legalChars[(d >> 18) & 63]);
			buf.append(legalChars[(d >> 12) & 63]);
			buf.append(legalChars[(d >> 6) & 63]);
			buf.append("=");
		} else if (i == start + len - 1) {
			int d = (((int) data[i]) & 0x0ff) << 16;

			buf.append(legalChars[(d >> 18) & 63]);
			buf.append(legalChars[(d >> 12) & 63]);
			buf.append("==");
		}

		return buf.toString();
	}

	private static int decode(char c) {
		if (c >= 'A' && c <= 'Z')
			return ((int) c) - 65;
		else if (c >= 'a' && c <= 'z')
			return ((int) c) - 97 + 26;
		else if (c >= '0' && c <= '9')
			return ((int) c) - 48 + 26 + 26;
		else
			switch (c) {
			case '+':
				return 62;
			case '/':
				return 63;
			case '=':
				return 0;
			default:
				throw new RuntimeException("unexpected code: " + c);
			}
	}

	public static byte[] decode(String s) {

		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		try {
			decode(s, bos);
		} catch (IOException e) {
			throw new RuntimeException();
		}
		byte[] decodedBytes = bos.toByteArray();
		try {
			bos.close();
			bos = null;
		} catch (IOException ex) {
			System.err.println("Error while decoding BASE64: " + ex.toString());
		}
		return decodedBytes;
	}

	private static void decode(String s, OutputStream os) throws IOException {
		int i = 0;

		int len = s.length();

		while (true) {
			while (i < len && s.charAt(i) <= ' ')
				i++;

			if (i == len)
				break;

			int tri = (decode(s.charAt(i)) << 18)
					+ (decode(s.charAt(i + 1)) << 12)
					+ (decode(s.charAt(i + 2)) << 6)
					+ (decode(s.charAt(i + 3)));

			os.write((tri >> 16) & 255);
			if (s.charAt(i + 2) == '=')
				break;
			os.write((tri >> 8) & 255);
			if (s.charAt(i + 3) == '=')
				break;
			os.write(tri & 255);

			i += 4;
		}
	}
	public static void main(String[] args) throws IOException {
		
		for(int i=0;i<20;i++){
			test();
			System.out.println("--------------------------");
		}
	}
	public static void test() throws IOException {

		Random random = new Random();
		int length = random.nextInt()%100;
		length = length<0 ? (-length):length;
		System.out.println("length:"+length);
		
		byte[] a = new byte[length];
		random.nextBytes(a);
		StringBuffer sb = new StringBuffer();
		String base64 = encode(a);
		System.out.println("自定义base:"+base64.replaceAll(" ", "").replaceAll("\n", ""));//不知为什么会混进空格和换行
		String aa = encoder.encode(a);
		System.out.println("官方原base:"+aa.replaceAll(" ", "").replaceAll("\n", ""));//不知为什么会混进空格和换行
		
		
		sb.delete(0,sb.length());
		for(byte b:a){
			sb.append((int)b);
		}
		System.out.println("明文原base:"+sb.toString());
		
		sb.delete(0,sb.length());
		a = decoder.decodeBuffer(aa);
		for(byte b:a){
			sb.append((int)b);
		}
		System.out.println("官方原base:"+sb.toString());
		
		sb.delete(0,sb.length());
		a = decode(base64);
		for(byte b:a){
			sb.append((int)b);
		}
		System.out.println("自定义base:"+sb.toString());
	}
}
发表评论
用户名: 匿名