public class Base64 {
public static final String encode(byte[] d) {
if (d == null) {
return null;
}
byte[] data = new byte[d.length + 2];
System.arraycopy(d, 0, data, 0, d.length);
byte[] dest = new byte[data.length / 3 * 4];
int sidx = 0;
for (int didx = 0; sidx < d.length; didx += 4) {
dest[didx] = (byte) (data[sidx] >>> 2 & 0x3F);
dest[(didx + 1)] = (byte) (data[(sidx + 1)] >>> 4 & 0xF | data[sidx] << 4 & 0x3F);
dest[(didx + 2)] = (byte) (data[(sidx + 2)] >>> 6 & 0x3 | data[(sidx + 1)] << 2 & 0x3F);
dest[(didx + 3)] = (byte) (data[(sidx + 2)] & 0x3F);
sidx += 3;
}
for (int idx = 0; idx < dest.length; ++idx) {
if (dest[idx] < 26)
dest[idx] = (byte) (dest[idx] + 65);
else if (dest[idx] < 52)
dest[idx] = (byte) (dest[idx] + 97 - 26);
else if (dest[idx] < 62)
dest[idx] = (byte) (dest[idx] + 48 - 52);
else if (dest[idx] < 63)
dest[idx] = 43;
else {
dest[idx] = 47;
}
}
for (int idx = dest.length - 1; idx > d.length * 4 / 3; --idx) {
dest[idx] = 61;
}
return new String(dest);
}
}