~ubuntu-branches/ubuntu/karmic/libxerces2-java/karmic

« back to all changes in this revision

Viewing changes to src/org/apache/xerces/impl/dv/util/HexBin.java

  • Committer: Bazaar Package Importer
  • Author(s): Stefan Gybas
  • Date: 2004-06-06 18:00:26 UTC
  • Revision ID: james.westby@ubuntu.com-20040606180026-a3vh56uc95hjbyfh
Tags: upstream-2.6.2
ImportĀ upstreamĀ versionĀ 2.6.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * The Apache Software License, Version 1.1
 
3
 *
 
4
 *
 
5
 * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
 
6
 * reserved.
 
7
 *
 
8
 * Redistribution and use in source and binary forms, with or without
 
9
 * modification, are permitted provided that the following conditions
 
10
 * are met:
 
11
 *
 
12
 * 1. Redistributions of source code must retain the above copyright
 
13
 *    notice, this list of conditions and the following disclaimer.
 
14
 *
 
15
 * 2. Redistributions in binary form must reproduce the above copyright
 
16
 *    notice, this list of conditions and the following disclaimer in
 
17
 *    the documentation and/or other materials provided with the
 
18
 *    distribution.
 
19
 *
 
20
 * 3. The end-user documentation included with the redistribution,
 
21
 *    if any, must include the following acknowledgment:
 
22
 *       "This product includes software developed by the
 
23
 *        Apache Software Foundation (http://www.apache.org/)."
 
24
 *    Alternately, this acknowledgment may appear in the software itself,
 
25
 *    if and wherever such third-party acknowledgments normally appear.
 
26
 *
 
27
 * 4. The names "Xerces" and "Apache Software Foundation" must
 
28
 *    not be used to endorse or promote products derived from this
 
29
 *    software without prior written permission. For written
 
30
 *    permission, please contact apache@apache.org.
 
31
 *
 
32
 * 5. Products derived from this software may not be called "Apache",
 
33
 *    nor may "Apache" appear in their name, without prior written
 
34
 *    permission of the Apache Software Foundation.
 
35
 *
 
36
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 
37
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
38
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 
39
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 
40
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
41
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 
42
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 
43
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 
44
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 
45
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 
46
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 
47
 * SUCH DAMAGE.
 
48
 * ====================================================================
 
49
 *
 
50
 * This software consists of voluntary contributions made by many
 
51
 * individuals on behalf of the Apache Software Foundation and was
 
52
 * originally based on software copyright (c) 1999, International
 
53
 * Business Machines, Inc., http://www.apache.org.  For more
 
54
 * information on the Apache Software Foundation, please see
 
55
 * <http://www.apache.org/>.
 
56
 */
 
57
 
 
58
package org.apache.xerces.impl.dv.util;
 
59
 
 
60
/**
 
61
 * format validation
 
62
 *
 
63
 * This class encodes/decodes hexadecimal data
 
64
 * @author Jeffrey Rodriguez
 
65
 * @version $Id: HexBin.java,v 1.8 2003/05/08 20:11:55 elena Exp $
 
66
 */
 
67
public final class  HexBin {
 
68
    static private final int  BASELENGTH   = 255;
 
69
    static private final int  LOOKUPLENGTH = 16;
 
70
    static final private byte [] hexNumberTable    = new byte[BASELENGTH];
 
71
    static final private char [] lookUpHexAlphabet = new char[LOOKUPLENGTH];
 
72
 
 
73
 
 
74
    static {
 
75
        for (int i = 0; i<BASELENGTH; i++ ) {
 
76
            hexNumberTable[i] = -1;
 
77
        }
 
78
        for ( int i = '9'; i >= '0'; i--) {
 
79
            hexNumberTable[i] = (byte) (i-'0');
 
80
        }
 
81
        for ( int i = 'F'; i>= 'A'; i--) {
 
82
            hexNumberTable[i] = (byte) ( i-'A' + 10 );
 
83
        }
 
84
        for ( int i = 'f'; i>= 'a'; i--) {
 
85
           hexNumberTable[i] = (byte) ( i-'a' + 10 );
 
86
        }
 
87
 
 
88
        for(int i = 0; i<10; i++ )
 
89
            lookUpHexAlphabet[i] = (char)('0'+i);
 
90
        for(int i = 10; i<=15; i++ )
 
91
            lookUpHexAlphabet[i] = (char)('A'+i -10);
 
92
    }
 
93
 
 
94
    /**
 
95
     * Encode a byte array to hex string
 
96
     *
 
97
     * @param binaryData  array of byte to encode
 
98
     * @return return     encoded string
 
99
     */
 
100
    static public String encode(byte[] binaryData) {
 
101
        if (binaryData == null)
 
102
            return null;
 
103
        int lengthData   = binaryData.length;
 
104
        int lengthEncode = lengthData * 2;
 
105
        char[] encodedData = new char[lengthEncode];
 
106
        int temp;
 
107
        for (int i = 0; i < lengthData; i++) {
 
108
            temp = binaryData[i];
 
109
            if (temp < 0)
 
110
                temp += 256;
 
111
            encodedData[i*2] = lookUpHexAlphabet[temp >> 4];
 
112
            encodedData[i*2+1] = lookUpHexAlphabet[temp & 0xf];
 
113
        }
 
114
        return new String(encodedData);
 
115
    }
 
116
 
 
117
    /**
 
118
     * Decode hex string to a byte array
 
119
     *
 
120
     * @param binaryData  encoded string
 
121
     * @return return     array of byte to encode
 
122
     */
 
123
    static public byte[] decode(String encoded) {
 
124
        if (encoded == null)
 
125
            return null;
 
126
        int lengthData = encoded.length();
 
127
        if (lengthData % 2 != 0)
 
128
            return null;
 
129
 
 
130
        char[] binaryData = encoded.toCharArray();
 
131
        int lengthDecode = lengthData / 2;
 
132
        byte[] decodedData = new byte[lengthDecode];
 
133
        byte temp1, temp2;
 
134
        for( int i = 0; i<lengthDecode; i++ ){
 
135
            temp1 = hexNumberTable[binaryData[i*2]];
 
136
            if (temp1 == -1)
 
137
                return null;
 
138
            temp2 = hexNumberTable[binaryData[i*2+1]];
 
139
            if (temp2 == -1)
 
140
                return null;
 
141
            decodedData[i] = (byte)((temp1 << 4) | temp2);
 
142
        }
 
143
        return decodedData;
 
144
    }
 
145
}