1:
38:
39: package ;
40:
41:
46: public final class BASE64
47: {
48:
49: private static final byte[] src = {
50: 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
51: 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
52: 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64,
53: 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e,
54: 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
55: 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
56: 0x38, 0x39, 0x2b, 0x2f
57: };
58:
59: private static final byte[] dst;
60: static
61: {
62: dst = new byte[0x100];
63: for (int i = 0x0; i < 0xff; i++)
64: {
65: dst[i] = -1;
66: }
67: for (int i = 0; i < src.length; i++)
68: {
69: dst[src[i]] = (byte) i;
70: }
71: }
72:
73: private BASE64()
74: {
75: }
76:
77:
82: public static byte[] encode(byte[] bs)
83: {
84: int si = 0, ti = 0;
85: byte[] bt = new byte[((bs.length + 2) * 4) / 3];
86: for (; si < bs.length; si += 3)
87: {
88: int buflen = bs.length - si;
89: if (buflen == 1)
90: {
91: byte b = bs[si];
92: int i = 0;
93: boolean flag = false;
94: bt[ti++] = src[b >>> 2 & 0x3f];
95: bt[ti++] = src[(b << 4 & 0x30) + (i >>> 4 & 0xf)];
96: }
97: else if (buflen == 2)
98: {
99: byte b1 = bs[si], b2 = bs[si + 1];
100: int i = 0;
101: bt[ti++] = src[b1 >>> 2 & 0x3f];
102: bt[ti++] = src[(b1 << 4 & 0x30) + (b2 >>> 4 & 0xf)];
103: bt[ti++] = src[(b2 << 2 & 0x3c) + (i >>> 6 & 0x3)];
104: }
105: else
106: {
107: byte b1 = bs[si], b2 = bs[si + 1], b3 = bs[si + 2];
108: bt[ti++] = src[b1 >>> 2 & 0x3f];
109: bt[ti++] = src[(b1 << 4 & 0x30) + (b2 >>> 4 & 0xf)];
110: bt[ti++] = src[(b2 << 2 & 0x3c) + (b3 >>> 6 & 0x3)];
111: bt[ti++] = src[b3 & 0x3f];
112: }
113: }
114: if (ti < bt.length)
115: {
116: byte[] tmp = new byte[ti];
117: System.arraycopy(bt, 0, tmp, 0, ti);
118: bt = tmp;
119: }
120:
124: return bt;
125: }
126:
127:
132: public static byte[] decode(byte[] bs)
133: {
134: int srclen = bs.length;
135: while (srclen > 0 && bs[srclen - 1] == 0x3d)
136: {
137: srclen--;
138: }
139: byte[] buffer = new byte[srclen];
140: int buflen = 0;
141: int si = 0;
142: int len = srclen - si;
143: while (len > 0)
144: {
145: byte b0 = dst[bs[si++] & 0xff];
146: byte b2 = dst[bs[si++] & 0xff];
147: buffer[buflen++] = (byte) (b0 << 2 & 0xfc | b2 >>> 4 & 0x3);
148: if (len > 2)
149: {
150: b0 = b2;
151: b2 = dst[bs[si++] & 0xff];
152: buffer[buflen++] = (byte) (b0 << 4 & 0xf0 | b2 >>> 2 & 0xf);
153: if (len > 3)
154: {
155: b0 = b2;
156: b2 = dst[bs[si++] & 0xff];
157: buffer[buflen++] = (byte) (b0 << 6 & 0xc0 | b2 & 0x3f);
158: }
159: }
160: len = srclen - si;
161: }
162: byte[] bt = new byte[buflen];
163: System.arraycopy(buffer, 0, bt, 0, buflen);
164: return bt;
165: }
166:
167: public static void main(String[] args)
168: {
169: boolean decode = false;
170: for (int i = 0; i < args.length; i++)
171: {
172: if (args[i].equals("-d"))
173: {
174: decode = true;
175: }
176: else
177: {
178: try
179: {
180: byte[] in = args[i].getBytes("US-ASCII");
181: byte[] out = decode ? decode(in) : encode(in);
182: System.out.println(args[i] + " = " +
183: new String(out, "US-ASCII"));
184: }
185: catch (java.io.UnsupportedEncodingException e)
186: {
187: e.printStackTrace(System.err);
188: }
189: }
190: }
191: }
192:
193: }