blob: 1210a02dde65aa37b7920a836b1c3cc6c6d889c5 [file] [log] [blame]
package aQute.lib.base64;
import java.io.*;
/*
* Base 64 converter.
*
* TODO Implement string to byte[]
*/
public class Base64 {
byte[] data;
static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static byte[] values = new byte[128];
static {
for (int i = 0; i < values.length; i++) {
values[i] = -1;
}
// Create reverse index
for (int i = 0; i < alphabet.length(); i++) {
char c = alphabet.charAt(i);
values[c] = (byte) i;
}
}
public Base64(byte data[]) {
this.data = data;
}
public final static byte[] decodeBase64(String string) {
string = string.trim();
ByteArrayOutputStream out = new ByteArrayOutputStream();
int register = 0;
int i = 0;
int pads = 0;
byte test[] = new byte[3];
while (i < string.length()) {
char c = string.charAt(i);
if (c > 0x7F)
throw new IllegalArgumentException(
"Invalid base64 character in " + string
+ ", character value > 128 ");
int v = 0;
if ( c == '=' ) {
pads++;
} else {
v = values[c];
if ( v < 0 )
throw new IllegalArgumentException(
"Invalid base64 character in " + string + ", " + c );
}
register <<= 6;
register |= v;
test[2] = (byte) (register & 0xFF);
test[1] = (byte) ((register >> 8) & 0xFF);
test[0] = (byte) ((register >> 16) & 0xFF);
i++;
if ((i % 4) == 0) {
flush(out, register, pads);
register = 0;
pads = 0;
}
}
return out.toByteArray();
}
static private void flush(ByteArrayOutputStream out, int register, int pads) {
switch (pads) {
case 0:
out.write(0xFF & (register >> 16));
out.write(0xFF & (register >> 8));
out.write(0xFF & (register >> 0));
break;
case 1:
out.write(0xFF & (register >> 16));
out.write(0xFF & (register >> 8));
break;
case 2:
out.write(0xFF & (register >> 16));
}
}
public Base64(String s) {
data = decodeBase64(s);
}
public String toString() {
return encodeBase64(data);
}
public static String encodeBase64(byte data[]) {
StringBuffer sb = new StringBuffer();
int buf = 0;
int bits = 0;
int n = 0;
while (true) {
if (bits >= 6) {
bits -= 6;
int v = 0x3F & (buf >> bits);
sb.append(alphabet.charAt(v));
} else {
if (n >= data.length)
break;
buf <<= 8;
buf |= 0xFF & data[n++];
bits += 8;
}
}
if (bits != 0) // must be less than 7
sb.append(alphabet.charAt(0x3F & (buf << (6 - bits))));
int mod = 4 - (sb.length() % 4);
if (mod != 4) {
for (int i = 0; i < mod; i++)
sb.append('=');
}
return sb.toString();
}
public Object toData() {
return data;
}
}