001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *  http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     */
019    
020    package org.apache.geronimo.mail.util;
021    
022    import java.io.ByteArrayOutputStream;
023    import java.io.IOException;
024    import java.io.OutputStream;
025    
026    public class Hex
027    {
028        private static final Encoder encoder = new HexEncoder();
029    
030        /**
031         * encode the input data producing a Hex encoded byte array.
032         *
033         * @return a byte array containing the Hex encoded data.
034         */
035        public static byte[] encode(
036            byte[]    data)
037        {
038            return encode(data, 0, data.length);
039        }
040    
041        /**
042         * encode the input data producing a Hex encoded byte array.
043         *
044         * @return a byte array containing the Hex encoded data.
045         */
046        public static byte[] encode(
047            byte[]    data,
048            int       off,
049            int       length)
050        {
051            ByteArrayOutputStream    bOut = new ByteArrayOutputStream();
052    
053            try
054            {
055                encoder.encode(data, off, length, bOut);
056            }
057            catch (IOException e)
058            {
059                throw new RuntimeException("exception encoding Hex string: " + e);
060            }
061    
062            return bOut.toByteArray();
063        }
064    
065        /**
066         * Hex encode the byte data writing it to the given output stream.
067         *
068         * @return the number of bytes produced.
069         */
070        public static int encode(
071            byte[]         data,
072            OutputStream   out)
073            throws IOException
074        {
075            return encoder.encode(data, 0, data.length, out);
076        }
077    
078        /**
079         * Hex encode the byte data writing it to the given output stream.
080         *
081         * @return the number of bytes produced.
082         */
083        public static int encode(
084            byte[]         data,
085            int            off,
086            int            length,
087            OutputStream   out)
088            throws IOException
089        {
090            return encoder.encode(data, 0, data.length, out);
091        }
092    
093        /**
094         * decode the Hex encoded input data. It is assumed the input data is valid.
095         *
096         * @return a byte array representing the decoded data.
097         */
098        public static byte[] decode(
099            byte[]    data)
100        {
101            ByteArrayOutputStream    bOut = new ByteArrayOutputStream();
102    
103            try
104            {
105                encoder.decode(data, 0, data.length, bOut);
106            }
107            catch (IOException e)
108            {
109                throw new RuntimeException("exception decoding Hex string: " + e);
110            }
111    
112            return bOut.toByteArray();
113        }
114    
115        /**
116         * decode the Hex encoded String data - whitespace will be ignored.
117         *
118         * @return a byte array representing the decoded data.
119         */
120        public static byte[] decode(
121            String    data)
122        {
123            ByteArrayOutputStream    bOut = new ByteArrayOutputStream();
124    
125            try
126            {
127                encoder.decode(data, bOut);
128            }
129            catch (IOException e)
130            {
131                throw new RuntimeException("exception decoding Hex string: " + e);
132            }
133    
134            return bOut.toByteArray();
135        }
136    
137        /**
138         * decode the Hex encoded String data writing it to the given output stream,
139         * whitespace characters will be ignored.
140         *
141         * @return the number of bytes produced.
142         */
143        public static int decode(
144            String          data,
145            OutputStream    out)
146            throws IOException
147        {
148            return encoder.decode(data, out);
149        }
150    }