devdaily home | apple | java | perl | unix | directory | blog

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.axis2.databinding.types ;


import java.io.ByteArrayOutputStream;
import java.io.Serializable;

/** Custom class for supporting primitive XSD data type hexBinary. */
public class HexBinary implements Serializable {

    private static final long serialVersionUID = -5082403899986720767L;

    byte[] m_value;

    public HexBinary() {
    }

    public HexBinary(String string) {
        m_value = decode(string);
    }

    public HexBinary(byte[] bytes) {
        m_value = bytes;
    }

    public byte[] getBytes() {
        return m_value;
    }

    public String toString() {
        return encode(m_value);
    }

    public int hashCode() {
        //TODO: How do we hash this?
        return super.hashCode();
    }

    public boolean equals(Object object) {
        //TODO: Is this good enough?
        String s1 = object.toString();
        String s2 = this.toString();
        return s1.equals(s2);
    }

    // public static final String ERROR_ODD_NUMBER_OF_DIGITS =
    //Messages.getMessage("oddDigits00");
    //public static final String ERROR_BAD_CHARACTER_IN_HEX_STRING =
    //        Messages.getMessage("badChars01");

    // Code from Ajp11, from Apache's JServ

    // Table for HEX to DEC byte translation
    public static final int[] DEC = {
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            00, 01, 02, 03, 04, 05, 06, 07, 8, 9, -1, -1, -1, -1, -1, -1,
            -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    };

    /**
     * Convert a String of hexadecimal digits into the corresponding byte array by encoding each two
     * hexadecimal digits as a byte.
     *
     * @param digits Hexadecimal digits representation
     * @throws IllegalArgumentException if an invalid hexadecimal digit is found, or the input
     *                                  string contains an odd number of hexadecimal digits
     */
    public static byte[] decode(String digits) {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        for (int i = 0; i < digits.length(); i += 2) {
            char c1 = digits.charAt(i);
            if ((i + 1) >= digits.length())
                throw new IllegalArgumentException
                        ();//ERROR_ODD_NUMBER_OF_DIGITS);
            char c2 = digits.charAt(i + 1);
            byte b = 0;
            if ((c1 >= '0') && (c1 <= '9'))
                b += ((c1 - '0') * 16);
            else if ((c1 >= 'a') && (c1 <= 'f'))
                b += ((c1 - 'a' + 10) * 16);
            else if ((c1 >= 'A') && (c1 <= 'F'))
                b += ((c1 - 'A' + 10) * 16);
            else
                throw new IllegalArgumentException
                        ();//ERROR_BAD_CHARACTER_IN_HEX_STRING);
            if ((c2 >= '0') && (c2 <= '9'))
                b += (c2 - '0');
            else if ((c2 >= 'a') && (c2 <= 'f'))
                b += (c2 - 'a' + 10);
            else if ((c2 >= 'A') && (c2 <= 'F'))
                b += (c2 - 'A' + 10);
            else
                throw new IllegalArgumentException
                        ();//ERROR_BAD_CHARACTER_IN_HEX_STRING);
            baos.write(b);
        }
        return (baos.toByteArray());

    }


    /**
     * Convert a byte array into a printable format containing a String of hexadecimal digit
     * characters (two per byte).
     *
     * @param bytes Byte array representation
     */
    public static String encode(byte bytes[]) {

        StringBuffer sb = new StringBuffer(bytes.length * 2);
        for (int i = 0; i < bytes.length; i++) {
            sb.append(convertDigit(bytes[i] >> 4));
            sb.append(convertDigit(bytes[i] & 0x0f));
        }
        return (sb.toString());

    }

    /**
     * Convert 4 hex digits to an int, and return the number of converted bytes.
     *
     * @param hex Byte array containing exactly four hexadecimal digits
     * @throws IllegalArgumentException if an invalid hexadecimal digit is included
     */
    public static int convert2Int(byte[] hex) {
        // Code from Ajp11, from Apache's JServ

        // assert b.length==4
        // assert valid data
        int len;
        if (hex.length < 4) return 0;
        if (DEC[hex[0]] < 0)
            throw new IllegalArgumentException();//ERROR_BAD_CHARACTER_IN_HEX_STRING);
        len = DEC[hex[0]];
        len = len << 4;
        if (DEC[hex[1]] < 0)
            throw new IllegalArgumentException();//ERROR_BAD_CHARACTER_IN_HEX_STRING);
        len += DEC[hex[1]];
        len = len << 4;
        if (DEC[hex[2]] < 0)
            throw new IllegalArgumentException();//ERROR_BAD_CHARACTER_IN_HEX_STRING);
        len += DEC[hex[2]];
        len = len << 4;
        if (DEC[hex[3]] < 0)
            throw new IllegalArgumentException();//ERROR_BAD_CHARACTER_IN_HEX_STRING);
        len += DEC[hex[3]];
        return len;
    }

    /**
     * [Private] Convert the specified value (0 .. 15) to the corresponding hexadecimal digit.
     *
     * @param value Value to be converted
     */
    private static char convertDigit(int value) {

        value &= 0x0f;
        if (value >= 10)
            return ((char)(value - 10 + 'a'));
        else
            return ((char)(value + '0'));

    }
}




Copyright 1998-2008 Alvin Alexander
All Rights Reserved.
 
devdaily.com is based in louisville, kentucky, and this web site is hosted by godaddy.com