Commit | Line | Data |
---|---|---|
c2da4d40 JL |
1 | package com.hexidec.util;\r |
2 | \r | |
3 | import java.util.Vector;\r | |
4 | \r | |
5 | public 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 | } |