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