java 工具类Base64工具

原理:

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

关于这个编码的规则:
①.把3个字符变成4个字符。
②每76个字符加一个换行符。(例子中未处理此规则)
③.最后的结束符也要处理。(字节总数%3为1:补2个==。字节总数%3为2补1个=)

package test;

import java.util.Base64;

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

@SuppressWarnings("restriction")
public class Base64Util{
	
	//字幕char数组以及索引的值得对应。
	static private char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
			.toCharArray();
	//
	static private byte[] codes = new byte[256];
	
	//完成数组下索引与b64值的对应关系
	static{
		//数组赋值初始化值
		for (int i = 0; i < 256; i++)
			codes[i] = -1;
		
		//A-Z赋值
		for (int i = 'A'; i <= 'Z'; i++)
			codes[i] = (byte) (i - 'A');
		//a-z赋值
		for (int i = 'a'; i <= 'z'; i++)
			codes[i] = (byte) (26 + i - 'a');
		//数字0-9赋值
		for (int i = '0'; i <= '9'; i++)
			codes[i] = (byte) (52 + i - '0');
		codes['+'] = 62;
		codes['/'] = 63;
	}
	
	
	/**
	 * BASE64解密
	 * sun公司原始base64解码
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] decryptBASE64(String base64Str) throws Exception{
		return (new BASE64Decoder()).decodeBuffer(base64Str);
	}

	/**
	 * BASE64加密
	 * sun公司原始base64编码
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String encryptBASE64(byte[] key){
		return (new BASE64Encoder()).encodeBuffer(key);
	}

	
	/**
	 * 自定义编码
	 */
	static public String encode(byte[] data){
		//准备扩充char 数组   (data.length + 2) / 3 保证3的倍数向上取整
		//扩充后字节为原来的4/3
		char[] out = new char[((data.length + 2) / 3) * 4];
		
		
		for (int i = 0, index = 0; i < data.length; i += 3, index += 4){
			boolean quad = false;
			boolean trip = false;
			int val = (0xFF & (int) data[i]);
			val <<= 8;
			if ((i + 1) < data.length){
				val |= (0xFF & (int) data[i + 1]);
				trip = true;
			}
			val <<= 8;
			if ((i + 2) < data.length){
				val |= (0xFF & (int) data[i + 2]);
				quad = true;
			}
			out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];
			val >>= 6;
			out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];
			val >>= 6;
			out[index + 1] = alphabet[val & 0x3F];
			val >>= 6;
			out[index + 0] = alphabet[val & 0x3F];
		}

		return new String(out);
	}

	/**
	 * 自定义解码
	 */
	static public byte[] decode(char[] data){
			//计算转换后字节长度
			int len = ((data.length + 3) / 4) * 3;
			//处理末尾补一个等号
			if (data.length > 0 && data[data.length - 1] == '=')
				--len;
			//处理末尾补两个等号
			if (data.length > 1 && data[data.length - 2] == '=')
				--len;
			//最终解密后的字节长度
			byte[] out = new byte[len];
			int shift = 0;
			int accum = 0;
			int index = 0;
			for (int ix = 0; ix < data.length; ix++){
				int value = codes[data[ix] & 0xFF];
				if (value >= 0){
					accum <<= 6;
					shift += 6;
					accum |= value;
					if (shift >= 8){
						shift -= 8;
						out[index++] = (byte) ((accum >> shift) & 0xff);
					}
				}
			}
			if (index != out.length)
				throw new Error("miscalculated data length!");
			return out;
		
	}
	
	
	/**
	 * BASE64加密
	 * util 包下的base64解码
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String decrypt64(String base64Str) throws Exception{
		//String encodeToString = Base64.getEncoder().encodeToString(base64Str.getBytes());
		//return (new BASE64Decoder()).decodeBuffer(base64Str);
		byte[] decode = Base64.getDecoder().decode(base64Str);
		return new String(decode,"utf-8");
	}

	/**
	 * BASE64加密
	 * util包下的base64编码
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String encrypt64(byte[] key){
		return Base64.getEncoder().encodeToString(key);
		
	}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值