package safe.webshell;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class Base64 {
List<byte[]> decode(byte[] input) {
List<byte[]> result = new LinkedList<byte[]>();
return result;
}
public static byte alpha(byte c) {
if (Character.isUpperCase(c)) {
return (byte) (c - 'A');
} else if (Character.isLowerCase(c)) {
return (byte) (c - 'a' + 26);
} else if (Character.isDigit(c)) {
return (byte) (c - '0' + 52);
} else if (c == '+') {
return (byte) (62);
} else if (c == '/') {
return (byte) (63);
} else if (c == '=') {
return (byte) (0xFE);
} else {
return (byte)0xFF;
}
}
public static boolean is_alpha(byte c) {
return Character.isUpperCase(c)
|| Character.isLowerCase(c)
|| Character.isDigit(c)
|| c == '+'
|| c == '/'
|| c == '=';
}
public static byte[] longest_sub_base64(byte[] input) {
if (input.length == 0) {
return input;
}
int max = 0;
int[] result = new int[input.length];
result[0] = is_alpha(input[0]) ? 1 : 0;
for (int i = 1; i < input.length; ++i) {
result[i] = is_alpha(input[i]) ? result[i - 1] + 1 : 0;
if (result[i] > result[max]) {
max = i;
}
}
return Arrays.copyOfRange(input, max - result[max] + 1, max + 1);
}
public static byte[] decode_base64(byte[] input) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
int i = 0;
int c;
for (i = 0; i < input.length; i += 4) {
if (i + 1 >= input.length
|| alpha(input[i]) == (byte)0xff
|| alpha(input[i + 1]) == (byte)0xff) {
break;
}
c = (alpha(input[i]) & 0b111111) << 2;
c |= (alpha(input[i + 1]) & 0b110000) >> 4;
output.write((byte)c);
if (i + 2 >= input.length || alpha(input[i + 2]) == (byte)0xfe) {
c = (alpha(input[i + 1]) & 0b001111) << 4;
output.write((byte)c);
break;
} else if (alpha(input[i + 2]) == (byte)0xff) {
break;
}
c = (alpha(input[i + 1]) & 0b001111) << 4;
c |= (alpha(input[i + 2]) & 0b111100) >> 2;
output.write((byte)c);
if (i + 3 >= input.length || alpha(input[i + 3]) == (byte)0xfe) {
c = (alpha(input[i + 2]) & 0b000011) << 6;
output.write((byte)c);
break;
} else if (i + 3 >= input.length || alpha(input[i + 3]) == (byte)0xff) {
break;
}
c = (alpha(input[i + 2]) & 0b000011) << 6;
c |= (alpha(input[i + 3]) & 0b111111);
output.write((byte)c);
}
return output.toByteArray();
}
public static void main(String[] args) {
System.out.println(new String(decode_base64("YWJjZA0==".getBytes())));
System.out.println(new String(longest_sub_base64("!@#$test---123456".getBytes())));
}
}