Base64介绍:
参考博文:
http://www.cnblogs.com/chengmo/archive/2014/05/18/3735917.html
以欲加密字符串 “AA” 为例:
加密步骤:
- 字符串 “AA”
- 将每个字符转化为转化为二进制表示: 1000001 1000001 (14位)
- 每个字符转化为二进制后不足8位首部补零:01000001 01000001 (16位)
- 不为24位的整数倍补零: 01000001 01000001 00000000 (24位)
- 每六位为一组: 010000 010100 000100 000000
- 转为十进制:16 20 4 0
- 将其作为索引取出Base64码表相应的值: Q U E = (若为 0, 使用字符 ‘=’ 填充)
- 最终结果为“QUE=”
以欲解密字符串 “QUE=” 为例:
解密步骤:
- 解密字符串”QUE=”
- 对每个字符找到其在Base64码表的索引:16 20 4 ( ‘=’ 忽略)
- 将每个索引转化为二进制: 10000 10100 100 (12位)
- 不足6位首部补零:010000 010100 000100 (18位)
- 每8位为一组,余下部分舍去: 01000001 01000001 (16位)
- 将其转化为十进制:65 65
- ASCII对应字符为:A A
- 解密字符串为: “AA”
代码实现:
/**
* @author DengZhiXiang
* @date 2018/4/24 13:37
* @description
*/
public class Base64Custom {
private static String base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/**
* 将 byte 数组内的每个字符转化为二进制表示
* 且每个字符占 8 位,不足 8 位用补 '0'
*
* @param bytes
* @return
*/
private static String translatesToBinary(byte[] bytes) {
StringBuilder binary = new StringBuilder();
for (byte b : bytes) {
StringBuilder byteBinary = new StringBuilder();
//转为二进制
while (b > 0) {
byteBinary.append(b % 2);
b /= 2;
}
//不足 8 位补 '0'
while (byteBinary.length() < 8) {
byteBinary.append('0');
}
binary.append(byteBinary.reverse());
}
//不足 24 位,补 '0'
while (binary.length() % 24 != 0) {
binary.append('0');
}
return binary.toString();
}
/**
* @param origin 原始字符串
* @param charsetName 字符集
* @return 编码后的字符串
* @throws UnsupportedEncodingException
*/
public static String encode(String origin, String charsetName) throws Exception {
StringBuilder result = new StringBuilder();
String strBinaryBytes = translatesToBinary(origin.getBytes(charsetName));
for (int i = 0; i <= strBinaryBytes.length() - 6; i += 6) {
//将每 6 位二进制表示字符串转化为整数
int temp = Integer.parseInt(strBinaryBytes.substring(i, i + 6), 2);
if (temp == 0) {
result.append('=');
} else {
result.append(base64Table.charAt(temp));
}
}
return result.toString();
}
/**
* 解码
*
* @param base64 加密过的字符串
* @param charsetName 解码字符集
* @return
* @throws UnsupportedEncodingException
*/
public static String decode(String base64, String charsetName) throws Exception {
char[] chars = base64.toCharArray();
StringBuilder builder = new StringBuilder();
for (char b : chars) {
if (b != '=') {
StringBuilder binary = new StringBuilder(Integer.toBinaryString(base64Table.indexOf(b)));
while (binary.toString().length() != 6) {
binary.insert(0, '0');
}
builder.append(binary.toString());
}
}
String base64str = builder.toString();
base64str = base64str.substring(0, base64str.length() - base64str.length() % 8);
byte[] bytes = new byte[base64str.length() / 8];
for (int i = 0; i < bytes.length; ++i) {
bytes[i] = (byte) Integer.parseInt(base64str.substring(i * 8, i * 8 + 8), 2);
}
return new String(bytes, charsetName);
}
}