107 lines
3.7 KiB
Java
107 lines
3.7 KiB
Java
package seed.utils;
|
|
|
|
public class kCertBase64 {
|
|
|
|
private static final char[] encodeTable = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
|
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
|
|
'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
|
|
'4', '5', '6', '7', '8', '9', '+', '/' };
|
|
|
|
public static char getEncode(int i) {
|
|
return encodeTable[i & 0x3F];
|
|
}
|
|
|
|
public static String encode(byte[] input) {
|
|
char[] result = new char[((input.length + 2) / 3) * 4];
|
|
|
|
int resultIndex = 0;
|
|
int checkLength = 0;
|
|
|
|
for (int i = 0; i < input.length; i = i + 3) {
|
|
checkLength = input.length - i;
|
|
if (checkLength == 2) {
|
|
result[resultIndex++] = getEncode(input[i] >> 2);
|
|
result[resultIndex++] = getEncode(((input[i] & 0x3) << 4) | ((input[i + 1] >> 4) & 0xF));
|
|
result[resultIndex++] = getEncode((input[i + 1] & 0xF) << 2);
|
|
result[resultIndex++] = '=';
|
|
} else if (checkLength == 1) {
|
|
result[resultIndex++] = getEncode(input[i] >> 2);
|
|
result[resultIndex++] = getEncode(((input[i]) & 0x3) << 4);
|
|
result[resultIndex++] = '=';
|
|
result[resultIndex++] = '=';
|
|
} else {
|
|
result[resultIndex++] = getEncode(input[i] >> 2);
|
|
result[resultIndex++] = getEncode(((input[i] & 0x3) << 4) | ((input[i + 1] >> 4) & 0xF));
|
|
result[resultIndex++] = getEncode(((input[i + 1] & 0xF) << 2) | ((input[i + 2] >> 6) & 0x3));
|
|
result[resultIndex++] = getEncode(input[i + 2] & 0x3F);
|
|
}
|
|
}
|
|
|
|
return new String(result);
|
|
}
|
|
|
|
private static final byte[] decodeTable = new byte[128];
|
|
private static final byte PADDING = 127;
|
|
|
|
static {
|
|
for (int i = 0; i < decodeTable.length; i++) {
|
|
decodeTable[i] = -1;
|
|
}
|
|
for (int i = 0; i < encodeTable.length; i++) {
|
|
decodeTable[encodeTable[i]] = (byte) i;
|
|
}
|
|
decodeTable['='] = PADDING;
|
|
}
|
|
|
|
public static byte[] decode(String input) {
|
|
int resultLength = getResultLength(input);
|
|
|
|
byte[] result = new byte[resultLength];
|
|
int resultIndex = 0;
|
|
|
|
byte[] splitBuff = new byte[4];
|
|
int bufIndex = 0;
|
|
|
|
for (int i = 0; i < input.length(); i++) {
|
|
char inputChar = input.charAt(i);
|
|
byte decodeValue = decodeTable[inputChar];
|
|
|
|
if (decodeValue != -1) {
|
|
splitBuff[bufIndex++] = decodeValue;
|
|
}
|
|
|
|
if (bufIndex == 4) {
|
|
result[resultIndex++] = (byte) ((splitBuff[0] << 2) | (splitBuff[1] >> 4));
|
|
if (splitBuff[2] != PADDING)
|
|
result[resultIndex++] = (byte) ((splitBuff[1] << 4) | (splitBuff[2] >> 2));
|
|
if (splitBuff[3] != PADDING)
|
|
result[resultIndex++] = (byte) ((splitBuff[2] << 6) | (splitBuff[3]));
|
|
bufIndex = 0;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static int getResultLength(String input) {
|
|
final int inputLength = input.length();
|
|
|
|
int paddingCheck = inputLength - 1;
|
|
int paddingSize = 0;
|
|
|
|
for (; paddingCheck >= 0; paddingCheck--) {
|
|
byte code = decodeTable[input.charAt(paddingCheck)];
|
|
if (code == PADDING)
|
|
continue;
|
|
if (code == -1) {
|
|
return input.length() / 4 * 3;
|
|
}
|
|
break;
|
|
}
|
|
|
|
paddingCheck++;
|
|
paddingSize = inputLength - paddingCheck;
|
|
|
|
return input.length() / 4 * 3 - paddingSize;
|
|
}
|
|
|
|
} |