base64编码实现

package com.ls.hfvj;

/**
 * 思路:base64只有64个字符,因此只需要6个二进制位来表示 实现:每3个字节为一组凑4个base64字符。
 * 多余一个字节补4个0bit位(共12位),凑成2个base64字符;多余两个字节补2个bit位(共18位),凑成3个base64字符。
 * 为了知道添加了bit位,(便于解码),一个=表示添加了2个bit位,两个=表示添加了4个bit位。
 *  @author lihao
 *  参:https://en.wikipedia.org/wiki/Base64
 */
public class Base64Encode {
	private static char[] TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
	private static int mask1 = 0x3F;// 00111111,取1-6位,从1开始编号
	private static int mask2 = mask1 << 6;// 取7-12位
	private static int mask3 = mask2 << 6;// 取13-18位
	private static int mask4 = mask3 << 6;// 取19-24位

	public static String encode(String str) {
		return encode0(str.getBytes());
	}

	public static String encode0(byte[] bytes) {
		int index1 = bytes.length / 3 * 3;//3N终点
		int i = 0;
		int groupVal = 0;//每3个字节为一组
		StringBuffer sb = new StringBuffer();
		while (i < index1) {
			groupVal = groupVal << 8;
			groupVal = groupVal | bytes[i];
			if (i % 3 == 2) {
				sb.append(TABLE[(groupVal & mask4) >>> 18]);
				sb.append(TABLE[(groupVal & mask3) >>> 12]);
				sb.append(TABLE[(groupVal & mask2) >>> 6]);
				sb.append(TABLE[(groupVal & mask1)]);
				groupVal = 0;
			}
			i++;
		}
		if (i != bytes.length - 1) {// 此时还剩多余的1或2个字节
			while (i < bytes.length) {
				groupVal = groupVal << 8;
				groupVal = groupVal | bytes[i];
				i++;
			}

			if (index1 == bytes.length - 1) {
				groupVal = groupVal << 4;// 补4bit0
				sb.append(TABLE[(groupVal & mask2) >>> 6]);
				sb.append(TABLE[(groupVal & mask1)]);
				sb.append("==");
			}
			if (index1 == bytes.length - 2) {
				groupVal = groupVal << 2;// 补2bit0
				sb.append(TABLE[(groupVal & mask3) >>> 12]);
				sb.append(TABLE[(groupVal & mask2) >>> 6]);
				sb.append(TABLE[(groupVal & mask1)]);
				sb.append("=");
			}
		}
		return sb.toString();
	}
	
	public static void main(String[] args) {
		String str="adbadngm";
		System.out.println(encode(str));
	}
}

猜你喜欢

转载自blog.csdn.net/away_lit/article/details/92428172