KickJava   Java API By Example, From Geeks To Geeks.

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


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.FilterInputStream JavaDoc;
36 import java.io.IOException JavaDoc;
37 import java.io.InputStream JavaDoc;
38
39 /**
40  * @author Andrey Kuznetsov
41  */

42 public class HexInputStream extends FilterInputStream JavaDoc {
43
44     private static final char encodeTable[] = {
45         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
46     };
47
48     public static final int decodeTable [] = new int[0x100];
49
50     static {
51         for (int i = 0; i < decodeTable.length; i++) {
52             decodeTable[i] = -1;
53         }
54         for (int j = 0; j < encodeTable.length; j++) {
55             decodeTable[encodeTable[j]] = j;
56         }
57     }
58
59     boolean finished;
60
61     byte [] buffer = new byte[80];
62     int count;
63     int pos;
64
65     public HexInputStream(InputStream JavaDoc in) {
66         super(in);
67     }
68
69     public int read() throws IOException JavaDoc {
70         if(pos >= count) {
71             if(finished) {
72                 return -1;
73             }
74             else {
75                 fillBuffer();
76             }
77         }
78
79         int i = buffer[pos++] & 0xFF;
80         return i;
81     }
82
83     private void fillBuffer() throws IOException JavaDoc {
84         int k = 0;
85         for (; k < buffer.length; k++) {
86             int b0 = in.read();
87             if (b0 == 13 || b0 == 10) {
88                 k--;
89                 continue;
90             }
91             if(b0 == '>') {
92                 k++;
93                 finished = true;
94                 break;
95             }
96             int b1 = in.read();
97             int d0 = decodeTable[b0];
98             int d1 = decodeTable[b1];
99             buffer[k] = (byte) (d0 * 16 + d1);
100         }
101         count = k;
102         pos = 0;
103     }
104
105     public int read(byte b[]) throws IOException JavaDoc {
106         return read(b, 0, b.length);
107     }
108
109     public int read(byte b[], int off, int len) throws IOException JavaDoc {
110         int i = off;
111
112         try {
113             for (; i < off + len; i++) {
114                 int a = read();
115                 if (a == -1) {
116                     i--;
117                     break;
118                 }
119                 b[i] = (byte) a;
120             }
121         }
122         catch (IOException JavaDoc ex) {
123             ex.printStackTrace();
124         }
125         return i - off;
126     }
127 }
128
Popular Tags