KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > imagero > uio > io > Base64


1 /*
2  * Copyright (c) Andrey Kuznetsov. All Rights Reserved.
3  *
4  * http://uio.imagero.com
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * o Redistributions of source code must retain the above copyright notice,
10  * this list of conditions and the following disclaimer.
11  *
12  * o Redistributions in binary form must reproduce the above copyright notice,
13  * this list of conditions and the following disclaimer in the documentation
14  * and/or other materials provided with the distribution.
15  *
16  * o Neither the name of imagero Andrei Kouznetsov nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
29  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */

32
33 package com.imagero.uio.io;
34
35 import java.io.ByteArrayInputStream JavaDoc;
36 import java.io.ByteArrayOutputStream JavaDoc;
37 import java.io.IOException JavaDoc;
38
39 /**
40  * This class shows how simple and straightforward can be implementation
41  * of base 64 codec using BitInputStream and BitOutputStream
42  * @author Andrey Kuznetsov
43  */

44 public class Base64 {
45
46     private static final char encodeTable[] = {
47         'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
48         'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
49         'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
50         'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
51     };
52
53     static int decodeTable [] = new int[0x100];
54
55     static {
56         for (int i = 0; i < decodeTable.length; i++) {
57             decodeTable[i] = -1;
58         }
59         for (int j = 0; j < encodeTable.length; j++) {
60             decodeTable[encodeTable[j]] = j;
61         }
62     }
63
64     /**
65      * base 64 encode
66      * @param b data to encode
67      * @return base 64 encoded String
68      * @throws IOException
69      */

70     public static String JavaDoc base64Encode(byte[] b) throws IOException JavaDoc {
71         BitInputStream bis = new BitInputStream(new ByteArrayInputStream JavaDoc(b));
72         bis.setBitsToRead(6);
73         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
74         while (true) {
75             int c = bis.read();
76             //EOF reached
77
if (c == -1) {
78                 break;
79             }
80             sb.append(encodeTable[c]);
81         }
82         while ((sb.length() % 4) != 0) {
83             //padding
84
sb.append('=');
85         }
86         return sb.toString();
87     }
88
89     /**
90      * decode base 64 encoded string
91      * @param s String to decode
92      * @return byte array
93      * @throws IOException
94      */

95     public static byte[] base64Decode(String JavaDoc s) throws IOException JavaDoc {
96         char[] chrs = s.toCharArray();
97         ByteArrayOutputStream JavaDoc bout = new ByteArrayOutputStream JavaDoc();
98         BitOutputStream bos = new BitOutputStream(bout);
99         bos.setBitsToWrite(6);
100
101         boolean flush = true;
102
103         for (int i = 0; i < chrs.length; i++) {
104             char c = chrs[i];
105             //start of padding
106
if (c == '=') {
107                 flush = false;
108                 break;
109             }
110             bos.write(decodeTable[c]);
111         }
112         if(flush) {
113             bos.flush();
114         }
115         return bout.toByteArray();
116     }
117 }
118
Popular Tags