Skip to content

Instantly share code, notes, and snippets.

@toboqus
Created February 23, 2016 08:46
Show Gist options
  • Save toboqus/1c9df2e2bbe66813a6fc to your computer and use it in GitHub Desktop.
Save toboqus/1c9df2e2bbe66813a6fc to your computer and use it in GitHub Desktop.
Encoding and Decoding in base64
package base64;
public class Base64 {
private static String CODES = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789+/=";
public static String encode(byte[] input){
StringBuilder out = new StringBuilder(input.length * 4 / 3);
int b;
for(int i = 0; i < input.length; i+=3){
b = ((input[i] & 0xFC) >> 2);
out.append(CODES.charAt(b));
b = (input[i] & 0x03) << 4;
if (i + 1 < input.length) {
b |= (input[i + 1] & 0xF0) >> 4;
out.append(CODES.charAt(b));
b = (input[i + 1] & 0x0F) << 2;
if (i + 2 < input.length) {
b |= (input[i + 2] & 0xC0) >> 6;
out.append(CODES.charAt(b));
b = input[i + 2] & 0x3F;
out.append(CODES.charAt(b));
} else {
out.append(CODES.charAt(b));
out.append('=');
}
} else {
out.append(CODES.charAt(b));
out.append("==");
}
}
return out.toString();
}
public static byte[] decode(String in){
if(in.length() % 4 != 0){
throw new IllegalArgumentException("Invalid input");
}
int lengthOfDecoded = ((in.length() * 3)/4) - (in.indexOf("=")>0?(in.length()-in.indexOf("=")) : 0);
byte[] decoded = new byte[lengthOfDecoded];
char[] inChars = in.toCharArray();
int[] b = new int[4];
int j = 0;
for(int i = 0; i < inChars.length; i+=4){
b[0] = CODES.indexOf(inChars[i]);
b[1] = CODES.indexOf(inChars[i+1]);
b[2] = CODES.indexOf(inChars[i+2]);
b[3] = CODES.indexOf(inChars[i+3]);
decoded[j++] =(byte) ((b[0] << 2) | (b[1] >> 4));
if(b[2] < 64){
decoded[j++] = (byte) ((b[1] << 4) | (b[2] >> 2));
if (b[3] < 64) {
decoded[j++] = (byte) ((b[2] << 6) | b[3]);
}
}
}
return decoded;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment