1 package name.angoca.zemucan.tools;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 public final class Base64 {
28
29
30
31 private static char[] map1 = new char[64];
32
33
34
35
36 private static byte[] map2 = new byte[128];
37 static {
38 int i = 0;
39 for (char c = 'A'; c <= 'Z'; c += 1) {
40 Base64.map1[i] = c;
41 i += 1;
42 }
43 for (char c = 'a'; c <= 'z'; c += 1) {
44 Base64.map1[i] = c;
45 i += 1;
46 }
47 for (char c = '0'; c <= '9'; c += 1) {
48 Base64.map1[i] = c;
49 i += 1;
50 }
51 Base64.map1[i] = '+';
52 i += 1;
53 Base64.map1[i] = '/';
54 i += 1;
55 }
56
57 static {
58 for (int i = 0; i < Base64.map2.length; i += 1) {
59 Base64.map2[i] = -1;
60 }
61 for (int i = 0; i < 64; i += 1) {
62 Base64.map2[Base64.map1[i]] = (byte) i;
63 }
64 }
65
66
67
68
69
70
71
72
73
74
75
76 public static byte[] decode(final char[] in) {
77 int iLen = in.length;
78 if (iLen % 4 != 0) {
79 throw new IllegalArgumentException(
80 "Length of Base64 encoded input string is not a multiple of 4.");
81 }
82 while ((iLen > 0) && (in[iLen - 1] == '=')) {
83 iLen -= 1;
84 }
85 final int oLen = (iLen * 3) / 4;
86 final byte[] out = new byte[oLen];
87 int ip = 0;
88 int op = 0;
89 while (ip < iLen) {
90 final int i0 = in[ip];
91 ip += 1;
92 final int i1 = in[ip];
93 ip += 1;
94 final int i2 = (ip < iLen) ? in[ip] : 'A';
95 ip += 1;
96 final int i3 = (ip < iLen) ? in[ip] : 'A';
97 ip += 1;
98 if ((i0 > 127) || (i1 > 127) || (i2 > 127) || (i3 > 127)) {
99 throw new IllegalArgumentException(
100 "Illegal character in Base64 encoded data.");
101 }
102 final int b0 = Base64.map2[i0];
103 final int b1 = Base64.map2[i1];
104 final int b2 = Base64.map2[i2];
105 final int b3 = Base64.map2[i3];
106 if ((b0 < 0) || (b1 < 0) || (b2 < 0) || (b3 < 0)) {
107 throw new IllegalArgumentException(
108 "Illegal character in Base64 encoded data.");
109 }
110 final int o0 = (b0 << 2) | (b1 >>> 4);
111 final int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2);
112 final int o2 = ((b2 & 3) << 6) | b3;
113 out[op] = (byte) o0;
114 op += 1;
115 if (op < oLen) {
116 out[op] = (byte) o1;
117 op += 1;
118 }
119 if (op < oLen) {
120 out[op] = (byte) o2;
121 op += 1;
122 }
123 }
124 return out;
125 }
126
127
128
129
130
131
132
133
134
135
136 public static byte[] decode(final String s) {
137 return Base64.decode(s.toCharArray());
138 }
139
140
141
142
143
144
145
146
147
148
149 public static String decodeString(final String s) {
150 return new String(Base64.decode(s));
151 }
152
153
154
155
156
157
158
159
160
161 public static char[] encode(final byte[] in) {
162 return Base64.encode(in, in.length);
163 }
164
165
166
167
168
169
170
171
172
173
174
175 public static char[] encode(final byte[] in, final int iLen) {
176
177 final int oDataLen = (iLen * 4 + 2) / 3;
178
179 final int oLen = ((iLen + 2) / 3) * 4;
180 final char[] out = new char[oLen];
181 int ip = 0;
182 int op = 0;
183 while (ip < iLen) {
184 final int i0 = in[ip] & 0xff;
185 ip += 1;
186 final int i1 = (ip < iLen) ? in[ip] & 0xff : 0;
187 ip += 1;
188 final int i2 = (ip < iLen) ? in[ip] & 0xff : 0;
189 ip += 1;
190 final int o0 = i0 >>> 2;
191 final int o1 = ((i0 & 3) << 4) | (i1 >>> 4);
192 final int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
193 final int o3 = i2 & 0x3F;
194 out[op] = Base64.map1[o0];
195 op += 1;
196 out[op] = Base64.map1[o1];
197 ip += 1;
198 out[op] = (op < oDataLen) ? Base64.map1[o2] : '=';
199 op += 1;
200 out[op] = (op < oDataLen) ? Base64.map1[o3] : '=';
201 op += 1;
202 }
203 return out;
204 }
205
206
207
208
209
210
211
212
213
214 public static String encodeString(final String s) {
215 return new String(Base64.encode(s.getBytes()));
216 }
217
218
219
220
221 private Base64() {
222
223 }
224 }