Java加密解密(六、BASE64)

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]));
		}
    }

}

你可能感兴趣的:(base64)