public class Base64Codec { private static byte[] emap; private static byte[] dmap; // static { byte[] map = { (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)'/', }; emap = map; dmap = new byte[128]; for (int i = 0; i < emap.length; i++) { dmap[emap[i]] = (byte) i; } } /** * Encode a String. */ public final String encode(String str) { if (str == null) { return null; } return new String(encode(str.getBytes())); } /** * Encode a byte array. */ public final byte[] encode(byte[] buf) { if (buf == null) { return null; } int sidx; int didx; byte dest[] = new byte[((buf.length + 2) / 3) * 4]; // 3-byte to 4-byte conversion + 0-63 to ascii printable conversion for (sidx = 0, didx = 0; sidx < buf.length - 2; sidx += 3) { dest[didx++] = emap[(buf[sidx] >>> 2) & 077]; dest[didx++] = emap[(buf[sidx + 1] >>> 4) & 017 | (buf[sidx] << 4) & 077]; dest[didx++] = emap[(buf[sidx + 2] >>> 6) & 003 | (buf[sidx + 1] << 2) & 077]; dest[didx++] = emap[buf[sidx + 2] & 077]; } if (sidx < buf.length) { dest[didx++] = emap[(buf[sidx] >>> 2) & 077]; if (sidx < buf.length - 1) { dest[didx++] = emap[(buf[sidx + 1] >>> 4) & 017 | (buf[sidx] << 4) & 077]; dest[didx++] = emap[(buf[sidx + 1] << 2) & 077]; } else { dest[didx++] = emap[(buf[sidx] << 4) & 077]; } } // add padding for (; didx < dest.length; didx++) { dest[didx] = (byte) '='; } return dest; } /** * Decode a string, use the bytes inside the string. */ public final String decode(String str) { if (str == null) { return null; } return new String(decode(str.getBytes())); } /** * Decode a byte array. */ public final byte[] decode(byte[] buf) { if (buf == null) { return null; } int tail = buf.length; while (buf[tail - 1] == '=') { tail--; } byte dest[] = new byte[tail - buf.length / 4]; // ascii printable to 0-63 conversion for (int idx = 0; idx < buf.length; idx++) { buf[idx] = dmap[buf[idx]]; } // 4-byte to 3-byte conversion int sidx; int didx; for (sidx = 0, didx = 0; didx < dest.length - 2; sidx += 4, didx += 3) { dest[didx] = (byte) (((buf[sidx] << 2) & 255) | ((buf[sidx + 1] >>> 4) & 003)); dest[didx + 1] = (byte) (((buf[sidx + 1] << 4) & 255) | ((buf[sidx + 2] >>> 2) & 017)); dest[didx + 2] = (byte) (((buf[sidx + 2] << 6) & 255) | (buf[sidx + 3] & 077)); } if (didx < dest.length) { dest[didx] = (byte) (((buf[sidx] << 2) & 255) | ((buf[sidx + 1] >>> 4) & 003)); } if (++didx < dest.length) { dest[didx] = (byte) (((buf[sidx + 1] << 4) & 255) | ((buf[sidx + 2] >>> 2) & 017)); } return dest; } // public final static void main(String argv[]) { Base64Codec codec = new Base64Codec(); if ("-e".equals(argv[0])) { System.out.println(codec.encode(argv[1])); } if ("-d".equals(argv[0])) { System.out.println(codec.decode(argv[1])); } } }