1 package org.ibex.crypto;
3 import java.io.UnsupportedEncodingException;
5 public final class Base64 {
6 private Base64() { /* can't be instansiated */ }
8 private static final char encodeMap[] = {
9 'A','B','C','D','E','F','G','H',
10 'I','J','K','L','M','N','O','P',
11 'Q','R','S','T','U','V','W','X',
12 'Y','Z','a','b','c','d','e','f',
13 'g','h','i','j','k','l','m','n',
14 'o','p','q','r','s','t','u','v',
15 'w','x','y','z','0','1','2','3',
16 '4','5','6','7','8','9','+','/'
19 private static final int decodeMap[] = {
20 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
21 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
22 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
23 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,
24 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
25 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
26 -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
27 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1
30 public static void main(String[] args){
31 if(args.length == 2 && args[0].equals("encode"))
32 System.out.println(encode(args[1].getBytes()));
33 else if(args.length == 2 && args[0].equals("decode"))
34 System.out.println(new String(decode(args[1])));
36 System.out.println("Usage: Base64 {encode,decode} text");
42 public static byte[] decode(String inString){
43 char[] in = inString.toCharArray();
46 byte[] out = new byte[in.length / 4 * 3];
48 for(int i=0;i<in.length;i++){
49 int x = decodeMap[in[i] & 0x7f];
52 theBytes = (theBytes << 6) | x;
56 out[outPos++] = (byte)((theBytes >>> 16) & 0xff);
57 out[outPos++] = (byte)((theBytes >>> 8) & 0xff);
58 out[outPos++] = (byte)((theBytes >>> 0) & 0xff);
63 out[outPos++] = (byte)((theBytes >>> 10) & 0xff);
64 out[outPos++] = (byte)((theBytes >>> 2) & 0xff);
67 out[outPos++] = (byte)((theBytes >> 4) & 0xff);
71 if(outPos < out.length){
72 byte[] a = new byte[outPos];
73 System.arraycopy(out,0,a,0,outPos);
80 public static String encode(String in) { return encode(getBytes(in)); }
81 public static String encode(byte[] in){
84 char[] out = new char[(in.length / 3 + 1) * 4];
86 for(int i=0;i<in.length;i++){
87 theBytes = (theBytes << 8) | in[i];
91 out[outPos++] = encodeMap[(theBytes >>> 18) & 0x3f];
92 out[outPos++] = encodeMap[(theBytes >>> 12) & 0x3f];
93 out[outPos++] = encodeMap[(theBytes >>> 6) & 0x3f];
94 out[outPos++] = encodeMap[(theBytes >>> 0) & 0x3f];
99 out[outPos++] = encodeMap[(theBytes >>> 10) & 0x3f];
100 out[outPos++] = encodeMap[(theBytes >>> 4) & 0x3f];
101 out[outPos++] = encodeMap[(theBytes << 2) & 0x3f];
105 out[outPos++] = encodeMap[(theBytes >>> 2) & 0x3f];
106 out[outPos++] = encodeMap[(theBytes << 4) & 0x3f];
111 return new String(out,0,outPos);
114 public static byte[] getBytes(String s) {
116 return s.getBytes("US-ASCII");
117 } catch (UnsupportedEncodingException e) {
118 throw new Error("should never happen");