Initial revision
[old-projects.git] / ekit / com / hexidec / util / Base64Codec.java
CommitLineData
c2da4d40
JL
1package com.hexidec.util;\r
2\r
3import java.util.Vector;\r
4\r
5public class Base64Codec\r
6{\r
7 public static Vector Base64Tokens = new Vector(64);\r
8 static\r
9 {\r
10 Base64Tokens.add("A");\r
11 Base64Tokens.add("B");\r
12 Base64Tokens.add("C");\r
13 Base64Tokens.add("D");\r
14 Base64Tokens.add("E");\r
15 Base64Tokens.add("F");\r
16 Base64Tokens.add("G");\r
17 Base64Tokens.add("H");\r
18 Base64Tokens.add("I");\r
19 Base64Tokens.add("J");\r
20 Base64Tokens.add("K");\r
21 Base64Tokens.add("L");\r
22 Base64Tokens.add("M");\r
23 Base64Tokens.add("N");\r
24 Base64Tokens.add("O");\r
25 Base64Tokens.add("P");\r
26 Base64Tokens.add("Q");\r
27 Base64Tokens.add("R");\r
28 Base64Tokens.add("S");\r
29 Base64Tokens.add("T");\r
30 Base64Tokens.add("U");\r
31 Base64Tokens.add("V");\r
32 Base64Tokens.add("W");\r
33 Base64Tokens.add("X");\r
34 Base64Tokens.add("Y");\r
35 Base64Tokens.add("Z");\r
36 Base64Tokens.add("a");\r
37 Base64Tokens.add("b");\r
38 Base64Tokens.add("c");\r
39 Base64Tokens.add("d");\r
40 Base64Tokens.add("e");\r
41 Base64Tokens.add("f");\r
42 Base64Tokens.add("g");\r
43 Base64Tokens.add("h");\r
44 Base64Tokens.add("i");\r
45 Base64Tokens.add("j");\r
46 Base64Tokens.add("k");\r
47 Base64Tokens.add("l");\r
48 Base64Tokens.add("m");\r
49 Base64Tokens.add("n");\r
50 Base64Tokens.add("o");\r
51 Base64Tokens.add("p");\r
52 Base64Tokens.add("q");\r
53 Base64Tokens.add("r");\r
54 Base64Tokens.add("s");\r
55 Base64Tokens.add("t");\r
56 Base64Tokens.add("u");\r
57 Base64Tokens.add("v");\r
58 Base64Tokens.add("w");\r
59 Base64Tokens.add("x");\r
60 Base64Tokens.add("y");\r
61 Base64Tokens.add("z");\r
62 Base64Tokens.add("0");\r
63 Base64Tokens.add("1");\r
64 Base64Tokens.add("2");\r
65 Base64Tokens.add("3");\r
66 Base64Tokens.add("4");\r
67 Base64Tokens.add("5");\r
68 Base64Tokens.add("6");\r
69 Base64Tokens.add("7");\r
70 Base64Tokens.add("8");\r
71 Base64Tokens.add("9");\r
72 Base64Tokens.add("+");\r
73 Base64Tokens.add("/");\r
74 } \r
75 public static final char Base64Pad = '=';\r
76 public static final char Linefeed = (char)10;\r
77 public static final char Carriage = (char)13;\r
78 public static final int LineMax = 75;\r
79\r
80 public Base64Codec()\r
81 {\r
82 }\r
83\r
84 public static String encode(String source)\r
85 {\r
86 byte[] sourceBytes = source.getBytes();\r
87 int byteTriad = sourceBytes.length % 3;\r
88 StringBuffer encoding = new StringBuffer();\r
89 int bitOffset = 7;\r
90 int b64Offset = 5;\r
91 int bytePlace = 0;\r
92 byte tokenValue = (byte)0;\r
93 int lineLength = 0;\r
94 while(bytePlace < sourceBytes.length)\r
95 {\r
96 tokenValue = (byte)((byte)tokenValue | (byte)((sourceBytes[bytePlace] & (1 << bitOffset)) > 0 ? (1 << b64Offset) : (byte)0));\r
97 bitOffset--;\r
98 if(bitOffset < 0)\r
99 {\r
100 bitOffset = 7;\r
101 bytePlace++;\r
102 }\r
103 b64Offset--;\r
104 if(b64Offset < 0)\r
105 {\r
106 b64Offset = 5;\r
107 encoding.append((String)(Base64Tokens.elementAt(tokenValue)));\r
108 tokenValue = (byte)0;\r
109 lineLength++;\r
110 if(lineLength > LineMax)\r
111 {\r
112 encoding.append(Carriage);\r
113 encoding.append(Linefeed);\r
114 lineLength = 0;\r
115 }\r
116 }\r
117 }\r
118 if(b64Offset != 5)\r
119 {\r
120 bytePlace--;\r
121 for(int i = b64Offset; i >= 0; i--)\r
122 {\r
123 if(bitOffset >= 0)\r
124 {\r
125 tokenValue = (byte)((byte)tokenValue | (byte)((sourceBytes[bytePlace] & (1 << bitOffset)) > 0 ? (1 << i) : (byte)0));\r
126 }\r
127 bitOffset--;\r
128 }\r
129 encoding.append((String)(Base64Tokens.elementAt(tokenValue)));\r
130 } \r
131 if(byteTriad == 2)\r
132 {\r
133 encoding.append(Base64Pad);\r
134 }\r
135 else if(byteTriad == 1)\r
136 {\r
137 encoding.append(Base64Pad);\r
138 encoding.append(Base64Pad);\r
139 }\r
140 return encoding.toString();\r
141 }\r
142\r
143 public static String decode(String source)\r
144 {\r
145 StringBuffer decoding = new StringBuffer();\r
146 int bitOffset = 7;\r
147 int b64Offset = 5;\r
148 int bytePlace = 0;\r
149 byte charValue = (byte)0;\r
150 while(bytePlace < source.length())\r
151 {\r
152 if(source.charAt(bytePlace) == Base64Pad)\r
153 {\r
154 // end processing when encountering special end-padding character\r
155 break;\r
156 }\r
157 if(source.charAt(bytePlace) == Linefeed || source.charAt(bytePlace) == Carriage)\r
158 {\r
159 // ignore standard line break characters\r
160 bytePlace++;\r
161 continue;\r
162 }\r
163 else\r
164 {\r
165 if(!Base64Tokens.contains(source.substring(bytePlace, bytePlace + 1)))\r
166 {\r
167 // ignore unknown characters (mostly implemented to deal with other line break character sequences)\r
168 bytePlace++;\r
169 continue;\r
170 }\r
171 else\r
172 {\r
173 byte currentByte = (byte)(Base64Tokens.indexOf(source.substring(bytePlace, bytePlace + 1)));\r
174 charValue = (byte)((byte)charValue | (byte)((currentByte & (1 << b64Offset)) > 0 ? (1 << bitOffset) : (byte)0));\r
175 bitOffset--;\r
176 if(bitOffset < 0)\r
177 {\r
178 bitOffset = 7;\r
179 decoding.append((char)charValue);\r
180 charValue = (byte)0;\r
181 }\r
182 b64Offset--;\r
183 if(b64Offset < 0)\r
184 {\r
185 b64Offset = 5;\r
186 bytePlace++;\r
187 }\r
188 }\r
189 }\r
190 }\r
191 return decoding.toString();\r
192 }\r
193}