KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > ch > ethz > ssh2 > crypto > Base64


1
2 package ch.ethz.ssh2.crypto;
3
4 import java.io.CharArrayWriter JavaDoc;
5 import java.io.IOException JavaDoc;
6
7 /**
8  * Basic Base64 Support.
9  *
10  * @author Christian Plattner, plattner@inf.ethz.ch
11  * @version $Id: Base64.java,v 1.4 2005/08/11 12:47:31 cplattne Exp $
12  */

13 public class Base64
14 {
15     static final char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
16     
17     public static char[] encode(byte[] content)
18     {
19         CharArrayWriter JavaDoc cw = new CharArrayWriter JavaDoc((4 * content.length) / 3);
20
21         int idx = 0;
22                     
23         int x = 0;
24
25         for (int i = 0; i < content.length; i++)
26         {
27             if (idx == 0)
28                 x = (content[i] & 0xff) << 16;
29             else if (idx == 1)
30                 x = x | ((content[i] & 0xff) << 8);
31             else
32                 x = x | (content[i] & 0xff);
33
34             idx++;
35
36             if (idx == 3)
37             {
38                 cw.write(alphabet[x >> 18]);
39                 cw.write(alphabet[(x >> 12) & 0x3f]);
40                 cw.write(alphabet[(x >> 6) & 0x3f]);
41                 cw.write(alphabet[x & 0x3f]);
42
43                 idx = 0;
44             }
45         }
46
47         if (idx == 1)
48         {
49             cw.write(alphabet[x >> 18]);
50             cw.write(alphabet[(x >> 12) & 0x3f]);
51             cw.write('=');
52             cw.write('=');
53         }
54
55         if (idx == 2)
56         {
57             cw.write(alphabet[x >> 18]);
58             cw.write(alphabet[(x >> 12) & 0x3f]);
59             cw.write(alphabet[(x >> 6) & 0x3f]);
60             cw.write('=');
61         }
62
63         return cw.toCharArray();
64     }
65
66     public static byte[] decode(char[] message) throws IOException JavaDoc
67     {
68         byte buff[] = new byte[4];
69         byte dest[] = new byte[message.length];
70
71         int bpos = 0;
72         int destpos = 0;
73
74         for (int i = 0; i < message.length; i++)
75         {
76             int c = message[i];
77
78             if ((c == '\n') || (c == '\r') || (c == ' ') || (c == '\t'))
79                 continue;
80
81             if ((c >= 'A') && (c <= 'Z'))
82             {
83                 buff[bpos++] = (byte) (c - 'A');
84             }
85             else if ((c >= 'a') && (c <= 'z'))
86             {
87                 buff[bpos++] = (byte) ((c - 'a') + 26);
88             }
89             else if ((c >= '0') && (c <= '9'))
90             {
91                 buff[bpos++] = (byte) ((c - '0') + 52);
92             }
93             else if (c == '+')
94             {
95                 buff[bpos++] = 62;
96             }
97             else if (c == '/')
98             {
99                 buff[bpos++] = 63;
100             }
101             else if (c == '=')
102             {
103                 buff[bpos++] = 64;
104             }
105             else
106             {
107                 throw new IOException JavaDoc("Illegal char in base64 code.");
108             }
109
110             if (bpos == 4)
111             {
112                 bpos = 0;
113
114                 if (buff[0] == 64)
115                     break;
116
117                 if (buff[1] == 64)
118                     throw new IOException JavaDoc("Unexpected '=' in base64 code.");
119
120                 if (buff[2] == 64)
121                 {
122                     int v = (((buff[0] & 0x3f) << 6) | ((buff[1] & 0x3f)));
123                     dest[destpos++] = (byte) (v >> 4);
124                     break;
125                 }
126                 else if (buff[3] == 64)
127                 {
128                     int v = (((buff[0] & 0x3f) << 12) | ((buff[1] & 0x3f) << 6) | ((buff[2] & 0x3f)));
129                     dest[destpos++] = (byte) (v >> 10);
130                     dest[destpos++] = (byte) (v >> 2);
131                     break;
132                 }
133                 else
134                 {
135                     int v = (((buff[0] & 0x3f) << 18) | ((buff[1] & 0x3f) << 12) | ((buff[2] & 0x3f) << 6) | ((buff[3] & 0x3f)));
136                     dest[destpos++] = (byte) (v >> 16);
137                     dest[destpos++] = (byte) (v >> 8);
138                     dest[destpos++] = (byte) (v);
139                 }
140             }
141         }
142
143         byte[] res = new byte[destpos];
144         System.arraycopy(dest, 0, res, 0, destpos);
145
146         return res;
147     }
148 }
149
Popular Tags