3 import java.util.Vector;
4 import java.util.Enumeration;
7 * Class with static functions for base64 encoding and decoding as well
12 static final char encv[] = {
13 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
14 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
15 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
16 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
17 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
18 static char x2c (char [] what, int off) {
20 digit = (what[off] >= 'A' ? ((what[off] & 0xdf) - 'A')+10 : (what[off] - '0'));
22 digit += (what[off+1] >= 'A' ? ((what[off+1] & 0xdf) - 'A')+10 : (what[off+1] - '0'));
26 private Coder() { // No Constructors...
30 * Remove URL escape sequences
32 * @param aurl A String with potential embedded escapes.
33 * @return the String with the escapes removed.
35 public static String unescape_url(String aurl) {
37 char [] url = new char [aurl.length()];
38 aurl.getChars(0, aurl.length(), url, 0);
39 StringBuffer ret = new StringBuffer();
40 for (i = 0; i < url.length; i++) {
42 ret.append(x2c(url, i+1));
44 } else if (url[i] == '+') {
46 } else ret.append(url[i]);
48 return (new String(ret));
52 * Encodes a byte array in base64 characters and returns the result
55 * @param data the Byte array
56 * @return The encoded string
59 public static String encode(byte [] data) {
60 StringBuffer ret = new StringBuffer();
61 int len = data.length;
65 int nib1, nib2, nib3, nib4;
68 c = (data[i++] & 0xFF);
69 c = (c << 8) | (data[i++] & 0xFF);
70 c = (c << 8) | (data[i++] & 0xFF);
71 nib1 = (c & 0x0FC0000) >>> 18;
72 nib2 = (c & 0x003F000) >>> 12;
73 nib3 = (c & 0x0000FC0) >>> 6;
74 nib4 = (c & 0x000003F);
75 ret.append(encv[nib1]);
76 ret.append(encv[nib2]);
77 ret.append(encv[nib3]);
78 ret.append(encv[nib4]);
83 if (p > 1) c |= (data[i++] & 0xFF);
85 if (p > 2) c |= (data[i++] & 0xFF); // Should never happen
86 nib1 = (c & 0x0FC0000) >>> 18;
87 nib2 = (c & 0x003F000) >>> 12;
88 nib3 = (c & 0x0000FC0) >>> 6;
89 nib4 = (c & 0x000003F);
90 ret.append(encv[nib1]);
91 ret.append(encv[nib2]);
92 if (p == 1) ret.append('=');
93 else ret.append(encv[nib3]);
97 return (new String(ret));
101 * Decodes a base64 encoded string and returns the decoded value
104 * @param s The base64 encoded string
105 * @return the byte array decoded
107 public static byte [] decode (String s) {
108 Vector v = new Vector();
114 for (i = 0; i < s.length(); i++) {
115 char c = s.charAt(i);
116 if (c == '/') z = 63;
117 else if (c == '+') z = 62;
118 else if ((c >= 'a') && (c <= 'z')) z = (c - 'a') + 26;
119 else if ((c >= 'A') && (c <= 'Z')) z = (c - 'A');
120 else if ((c >= '0') && (c <= '9')) z = (c - '0') + 52;
129 for (z = 0; z < 3; z++) {
130 v.addElement(new Integer((reg & 0xff0000) >>> 16));
136 Enumeration e = v.elements();
137 byte [] retval = new byte[v.size() - p];
138 for(i = 0; i < v.size() - p; i++) {
139 retval[i] = ((Integer) e.nextElement()).byteValue();