package org.herac.tuxguitar.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import org.apache.log4j.Logger; public class Base64Encoder { /** The Logger for this class. */ public static final transient Logger LOG = Logger .getLogger(Base64Encoder.class); private static final int BUFFER_SIZE = 1024; private static byte ENCODING[] = { (byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y', (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) '+', (byte) '/', (byte) '=' }; public static byte[] encode(byte[] bytes) { try { ByteArrayInputStream in = new ByteArrayInputStream(bytes); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte buffer[] = new byte[BUFFER_SIZE]; int got = -1; int off = 0; int count = 0; while ((got = in.read(buffer, off, BUFFER_SIZE - off)) > 0) { if ((got + off) >= 3) { got += off; off = 0; while (off + 3 <= got) { int c1 = get1(buffer, off); int c2 = get2(buffer, off); int c3 = get3(buffer, off); int c4 = get4(buffer, off); switch (count) { case 73: out.write(ENCODING[c1]); out.write(ENCODING[c2]); out.write(ENCODING[c3]); out.write('\n'); out.write(ENCODING[c4]); count = 1; break; case 74: out.write(ENCODING[c1]); out.write(ENCODING[c2]); out.write('\n'); out.write(ENCODING[c3]); out.write(ENCODING[c4]); count = 2; break; case 75: out.write(ENCODING[c1]); out.write('\n'); out.write(ENCODING[c2]); out.write(ENCODING[c3]); out.write(ENCODING[c4]); count = 3; break; case 76: out.write('\n'); out.write(ENCODING[c1]); out.write(ENCODING[c2]); out.write(ENCODING[c3]); out.write(ENCODING[c4]); count = 4; break; default: out.write(ENCODING[c1]); out.write(ENCODING[c2]); out.write(ENCODING[c3]); out.write(ENCODING[c4]); count += 4; break; } off += 3; } for (int i = 0; i < 3; i++) { buffer[i] = (i < got - off) ? buffer[off + i] : ((byte) 0); } off = got - off; } else { off += got; } } switch (off) { case 1: out.write(ENCODING[get1(buffer, 0)]); out.write(ENCODING[get2(buffer, 0)]); out.write('='); out.write('='); break; case 2: out.write(ENCODING[get1(buffer, 0)]); out.write(ENCODING[get2(buffer, 0)]); out.write(ENCODING[get3(buffer, 0)]); out.write('='); } return out.toByteArray(); } catch (Throwable throwable) { LOG.error(throwable); } return bytes; } private static int get1(byte buf[], int off) { return (buf[off] & 0xfc) >> 2; } private static int get2(byte buf[], int off) { return ((buf[off] & 0x3) << 4) | ((buf[off + 1] & 0xf0) >>> 4); } private static int get3(byte buf[], int off) { return ((buf[off + 1] & 0x0f) << 2) | ((buf[off + 2] & 0xc0) >>> 6); } private static int get4(byte buf[], int off) { return buf[off + 2] & 0x3f; } }