--- /dev/null
+package com.hexidec.util;\r
+\r
+import java.util.Vector;\r
+\r
+public class Base64Codec\r
+{\r
+ public static Vector Base64Tokens = new Vector(64);\r
+ static\r
+ {\r
+ Base64Tokens.add("A");\r
+ Base64Tokens.add("B");\r
+ Base64Tokens.add("C");\r
+ Base64Tokens.add("D");\r
+ Base64Tokens.add("E");\r
+ Base64Tokens.add("F");\r
+ Base64Tokens.add("G");\r
+ Base64Tokens.add("H");\r
+ Base64Tokens.add("I");\r
+ Base64Tokens.add("J");\r
+ Base64Tokens.add("K");\r
+ Base64Tokens.add("L");\r
+ Base64Tokens.add("M");\r
+ Base64Tokens.add("N");\r
+ Base64Tokens.add("O");\r
+ Base64Tokens.add("P");\r
+ Base64Tokens.add("Q");\r
+ Base64Tokens.add("R");\r
+ Base64Tokens.add("S");\r
+ Base64Tokens.add("T");\r
+ Base64Tokens.add("U");\r
+ Base64Tokens.add("V");\r
+ Base64Tokens.add("W");\r
+ Base64Tokens.add("X");\r
+ Base64Tokens.add("Y");\r
+ Base64Tokens.add("Z");\r
+ Base64Tokens.add("a");\r
+ Base64Tokens.add("b");\r
+ Base64Tokens.add("c");\r
+ Base64Tokens.add("d");\r
+ Base64Tokens.add("e");\r
+ Base64Tokens.add("f");\r
+ Base64Tokens.add("g");\r
+ Base64Tokens.add("h");\r
+ Base64Tokens.add("i");\r
+ Base64Tokens.add("j");\r
+ Base64Tokens.add("k");\r
+ Base64Tokens.add("l");\r
+ Base64Tokens.add("m");\r
+ Base64Tokens.add("n");\r
+ Base64Tokens.add("o");\r
+ Base64Tokens.add("p");\r
+ Base64Tokens.add("q");\r
+ Base64Tokens.add("r");\r
+ Base64Tokens.add("s");\r
+ Base64Tokens.add("t");\r
+ Base64Tokens.add("u");\r
+ Base64Tokens.add("v");\r
+ Base64Tokens.add("w");\r
+ Base64Tokens.add("x");\r
+ Base64Tokens.add("y");\r
+ Base64Tokens.add("z");\r
+ Base64Tokens.add("0");\r
+ Base64Tokens.add("1");\r
+ Base64Tokens.add("2");\r
+ Base64Tokens.add("3");\r
+ Base64Tokens.add("4");\r
+ Base64Tokens.add("5");\r
+ Base64Tokens.add("6");\r
+ Base64Tokens.add("7");\r
+ Base64Tokens.add("8");\r
+ Base64Tokens.add("9");\r
+ Base64Tokens.add("+");\r
+ Base64Tokens.add("/");\r
+ } \r
+ public static final char Base64Pad = '=';\r
+ public static final char Linefeed = (char)10;\r
+ public static final char Carriage = (char)13;\r
+ public static final int LineMax = 75;\r
+\r
+ public Base64Codec()\r
+ {\r
+ }\r
+\r
+ public static String encode(String source)\r
+ {\r
+ byte[] sourceBytes = source.getBytes();\r
+ int byteTriad = sourceBytes.length % 3;\r
+ StringBuffer encoding = new StringBuffer();\r
+ int bitOffset = 7;\r
+ int b64Offset = 5;\r
+ int bytePlace = 0;\r
+ byte tokenValue = (byte)0;\r
+ int lineLength = 0;\r
+ while(bytePlace < sourceBytes.length)\r
+ {\r
+ tokenValue = (byte)((byte)tokenValue | (byte)((sourceBytes[bytePlace] & (1 << bitOffset)) > 0 ? (1 << b64Offset) : (byte)0));\r
+ bitOffset--;\r
+ if(bitOffset < 0)\r
+ {\r
+ bitOffset = 7;\r
+ bytePlace++;\r
+ }\r
+ b64Offset--;\r
+ if(b64Offset < 0)\r
+ {\r
+ b64Offset = 5;\r
+ encoding.append((String)(Base64Tokens.elementAt(tokenValue)));\r
+ tokenValue = (byte)0;\r
+ lineLength++;\r
+ if(lineLength > LineMax)\r
+ {\r
+ encoding.append(Carriage);\r
+ encoding.append(Linefeed);\r
+ lineLength = 0;\r
+ }\r
+ }\r
+ }\r
+ if(b64Offset != 5)\r
+ {\r
+ bytePlace--;\r
+ for(int i = b64Offset; i >= 0; i--)\r
+ {\r
+ if(bitOffset >= 0)\r
+ {\r
+ tokenValue = (byte)((byte)tokenValue | (byte)((sourceBytes[bytePlace] & (1 << bitOffset)) > 0 ? (1 << i) : (byte)0));\r
+ }\r
+ bitOffset--;\r
+ }\r
+ encoding.append((String)(Base64Tokens.elementAt(tokenValue)));\r
+ } \r
+ if(byteTriad == 2)\r
+ {\r
+ encoding.append(Base64Pad);\r
+ }\r
+ else if(byteTriad == 1)\r
+ {\r
+ encoding.append(Base64Pad);\r
+ encoding.append(Base64Pad);\r
+ }\r
+ return encoding.toString();\r
+ }\r
+\r
+ public static String decode(String source)\r
+ {\r
+ StringBuffer decoding = new StringBuffer();\r
+ int bitOffset = 7;\r
+ int b64Offset = 5;\r
+ int bytePlace = 0;\r
+ byte charValue = (byte)0;\r
+ while(bytePlace < source.length())\r
+ {\r
+ if(source.charAt(bytePlace) == Base64Pad)\r
+ {\r
+ // end processing when encountering special end-padding character\r
+ break;\r
+ }\r
+ if(source.charAt(bytePlace) == Linefeed || source.charAt(bytePlace) == Carriage)\r
+ {\r
+ // ignore standard line break characters\r
+ bytePlace++;\r
+ continue;\r
+ }\r
+ else\r
+ {\r
+ if(!Base64Tokens.contains(source.substring(bytePlace, bytePlace + 1)))\r
+ {\r
+ // ignore unknown characters (mostly implemented to deal with other line break character sequences)\r
+ bytePlace++;\r
+ continue;\r
+ }\r
+ else\r
+ {\r
+ byte currentByte = (byte)(Base64Tokens.indexOf(source.substring(bytePlace, bytePlace + 1)));\r
+ charValue = (byte)((byte)charValue | (byte)((currentByte & (1 << b64Offset)) > 0 ? (1 << bitOffset) : (byte)0));\r
+ bitOffset--;\r
+ if(bitOffset < 0)\r
+ {\r
+ bitOffset = 7;\r
+ decoding.append((char)charValue);\r
+ charValue = (byte)0;\r
+ }\r
+ b64Offset--;\r
+ if(b64Offset < 0)\r
+ {\r
+ b64Offset = 5;\r
+ bytePlace++;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return decoding.toString();\r
+ }\r
+}
\ No newline at end of file