
com.hecloud.runtime.common.encryptor.Base64Coder Maven / Gradle / Ivy
package com.hecloud.runtime.common.encryptor;
/**
* @author LoveInBj
*/
public class Base64Coder {
static private char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray();
static private byte[] codes = new byte[256];
static char A = 'A';
static char a = 'a';
static char Z = 'Z';
static char z = 'z';
static char ZERO = '0';
static char NINE = '9';
static {
for (int i = 0; i < 256; i++) {
codes[i] = -1;
}
for (int i = A; i <= Z; i++) {
codes[i] = (byte) (i - A);
}
for (int i = a; i <= z; i++) {
codes[i] = (byte) (26 + i - a);
}
for (int i = ZERO; i <= NINE; i++) {
codes[i] = (byte) (52 + i - ZERO);
}
codes['+'] = 62;
codes['/'] = 63;
}
/**
* 将原始数据编码为base64编码
*
* @param data 数据
* @return 编码后字符串
* @throws Exception 运行异常 异常
*/
static public String encode(byte[] data) throws Exception {
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);
}
/**
* 将base64编码的数据解码成原始数据
*
* @param data 编码数据
* @return 原始数据
* @throws Exception 运行异常 运行异常
*/
static public byte[] decode(char[] data) throws Exception {
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 Exception("数据长度计算错误!");
}
return out;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy