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));
}
}