Initial revision
[old-projects.git] / ekit / com / hexidec / util / Base64Codec.java
diff --git a/ekit/com/hexidec/util/Base64Codec.java b/ekit/com/hexidec/util/Base64Codec.java
new file mode 100644 (file)
index 0000000..ebf367c
--- /dev/null
@@ -0,0 +1,193 @@
+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