Convert.java Source code

Java tutorial

Introduction

Here is the source code for Convert.java

Source

/* 
 * Copyright (c) 2002,2003 Free Software Foundation
 * developed under the custody of the
 * Open Web Application Security Project
 * (http://www.owasp.org)
 * 
 * This file is part of the OWASP common library (OCL).
 * OCL is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * OCL is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * The valid license text for this file can be retrieved with
 * the call:   java -cp owasp.jar org.owasp.LICENSE
 * 
 * If you are not able to view the LICENSE that way, which should
 * always be possible within a valid and working OCL release,
 * please write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * to get a copy of the GNU General Public License or to report a
 * possible license violation.
 */

import java.util.Arrays;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/** 
 * Conversion utilities.
 * 
 * @since beta 1
 * @version beta 1<br />CVS $Revision: 1.8 $ $Author: istr $
 * @author <a href="mailto:ingo@ingostruck.de">ingo@ingostruck.de</a>
 */
public final class Convert {
    /** Revision identifier */
    public static final String MODULE = "<Convert beta 1, CVS $Revision: 1.8 $>";
    /** to mimic sizeof(short) = short length in bytes = 12 (=16bit) */
    public static final int SIZEOF_SHORT = 2;
    /** to mimic sizeof(int) = int length in bytes = 4 (=32bit) */
    public static final int SIZEOF_INT = 4;
    /** to mimic sizeof(long) = long length in bytes = 8 (=64bit) */
    public static final int SIZEOF_LONG = 8;
    /** bit length of byte */
    public static final int BITS_BYTE = 8;
    /** bit length of short */
    public static final int BITS_SHORT = BITS_BYTE * SIZEOF_SHORT;
    /** bit length of int */
    public static final int BITS_INT = BITS_BYTE * SIZEOF_INT;
    /** bit length of long */
    public static final int BITS_LONG = BITS_BYTE * SIZEOF_LONG;
    /** mask a byte in an int */
    public static final int MASK_BYTE = 0xFF;

    /** Avoids instantiation */
    private Convert() {
    }

    /**
     * Converts the SIZEOF_LONG bytes starting at off within b to a long value.
     * <br />NOTE: the conversion treats the leftmost byte as the lowest byte of
     * the resulting long value
     * @param b a byte[] containing bytes to be converted
     * @param off the offset where to find the bytes to be converted
     * @return a long value
     * @throws IndexOutOfBoundsException if an index violation occurs
     */
    public static long toLong(byte[] b, int off) {
        long r = 0;
        for (int i = SIZEOF_LONG - 1; i >= 0; i--)
            r |= (((long) b[off + i]) & MASK_BYTE) << (i * BITS_BYTE);
        return r;
    }

    /**
     * Converts the SIZEOF_INT bytes starting at off within b to an int value.
     * <br />NOTE: the conversion treats the leftmost byte as the lowest byte of
     * the resulting int value
     * @param b a byte[] containing bytes to be converted
     * @param off the offset where to find the bytes to be converted
     * @return an int value
     * @throws IndexOutOfBoundsException if an index violation occurs
     */
    public static int toInt(byte[] b, int off) {
        int r = 0;
        for (int i = SIZEOF_INT - 1; i >= 0; i--)
            r |= ((int) (b[off + i] & MASK_BYTE)) << (i * BITS_BYTE);
        return r;
    }

    /**
     * Converts a long value to SIZEOF_LONG bytes stored in b starting at off.
     * <br />NOTE: the conversion stores the lowest byte of the long value as
     * the leftmost byte within the sequence
     * @param val a long value to be split up into bytes
     * @param b a byte[] to be written to
     * @param off the offset where to start writing within b
     * @throws IndexOutOfBoundsException if an index violation occurs
     */
    public static void toBytes(long val, byte[] b, int off) {
        for (int i = 0; i < SIZEOF_LONG; i++, val >>= BITS_BYTE)
            b[off + i] = (byte) (val & MASK_BYTE);
    }

    /**
     * Converts an int value to SIZEOF_INT bytes stored in b starting at off.
     * <br />NOTE: the conversion stores the lowest byte of the int value as
     * the leftmost byte within the sequence
     * @param val an int value to be split up into bytes
     * @param b a byte[] to be written to
     * @param off the offset where to start writing within b
     * @throws IndexOutOfBoundsException if an index violation occurs
     */
    public static void toBytes(int val, byte[] b, int off) {
        for (int i = 0; i < SIZEOF_INT; i++, val >>= BITS_BYTE)
            b[off + i] = (byte) (val & MASK_BYTE);
    }

    /**
     * Converts a byte value to a hexadecimal String.
     * @param b a byte value
     * @return a hexadecimal (upper-case-based) String representation of the
     * byte value
     */
    public static String toHexString(byte b) {
        int len = 2;
        byte[] dig = new byte[len];
        dig[0] = (byte) ((b & 0xF0) >> 4);
        dig[1] = (byte) (b & 0x0F);
        for (int i = 0; i < len; i++)
            dig[i] += 10 > dig[i] ? 48 : 55;
        return new String(dig);
    }

    public static String toHexString(byte[] b) {
        if (null == b)
            return null;
        int len = b.length;
        byte[] hex = new byte[len << 1];
        for (int i = 0, j = 0; i < len; i++, j += 2) {
            hex[j] = (byte) ((b[i] & 0xF0) >> 4);
            hex[j] += 10 > hex[j] ? 48 : 55;
            hex[j + 1] = (byte) (b[i] & 0x0F);
            hex[j + 1] += 10 > hex[j + 1] ? 48 : 55;
        }
        return new String(hex);
    }

    /** 
     * Parses a number from a string.
     * Finds the first recognizable base-10 number (integer or floating point)
     * in the string and returns it as a Number.
     * @param string String to parse
     * @return first recognizable number
     * @exception NumberFormatException if no recognizable number is found
     */
    public static Number toNumber(String s) throws NumberFormatException {
        // parsing states
        int INT = 0;
        int FRAC = 1;
        int EXP = 2;
        int p = 0;
        for (int i = 0; i < s.length(); ++i) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                int start = i;
                int end = ++i;
                int state = INT;
                if (start > 0 && s.charAt(start - 1) == '.') {
                    --start;
                    state = FRAC;
                }
                if (start > 0 && s.charAt(start - 1) == '-')
                    --start;
                boolean atEnd = false;
                while (!atEnd && i < s.length()) {
                    switch (s.charAt(i)) {
                    case '0':
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
                        end = ++i;
                        break;
                    case '.':
                        if (state == INT) {
                            state = FRAC;
                            ++i;
                        } else {
                            atEnd = true;
                        }
                        break;
                    case 'e':
                    case 'E':
                        state = EXP;
                        ++i;
                        if (i < s.length() && ((c = s.charAt(i)) == '+' || c == '-'))
                            ++i;
                        break;
                    default:
                        atEnd = true;
                    }
                }
                String num = s.substring(start, end);
                try {
                    if (state == INT)
                        return new Integer(num);
                    else
                        return new Double(num);
                } catch (NumberFormatException e) {
                    throw new RuntimeException("internal error: " + e);
                }
            }
        }
        throw new NumberFormatException(s);
    }

    public static String[] toStrings(Object[] o) {
        if (null == o)
            return null;
        int len = o.length;
        String[] s = new String[len];
        for (int i = 0; i < len; i++)
            if (null != o[i])
                s[i] = o[i].toString();
        return s;
    }

    /** converts to int with radix 10 and default 0 */
    public static int toInt(Object o) {
        return toInt(o, 10, 0);
    }

    /**
     * Convets an Object to an int value using radix 10.
     * <br />This is a wrapper for
     * <code>{@link #toInt( Object, int ) toInt( o, 10 )}</code>.
     * @param o Object to be converted to integer
     * @return the int value represented by o or 0 if conversion fails.
     */
    public static int toInt(Object o, int dflt) {
        return toInt(o, 10, dflt);
    }

    /**
     * Converts any String representation to an int value using a given radix.
     * <br />For <code>null</code> it returns <code>0</code>.<br />
     * For Objects instanceof Number it returns the Object's
     * <code>intValue()</code>.
     * For all other Objects it uses the <code>toString()</code> method to get an
     * appropriate String representation and parses this String using
     * <code>Integer.parseInt</code>.
     * If conversion fails it returns <code>0</code>.
     * @param o Object to be converted to integer
     * @param radix the radix used for conversion
     * @return the int value represented by <code>o</code> or <code>0</code>
     * if conversion fails.
     */
    public static int toInt(Object o, int radix, int dflt) {
        if (null == o) // shortcut without exception
            return dflt;
        if (o instanceof Number)
            return ((Number) o).intValue();
        try {
            return Integer.parseInt(o.toString().trim(), radix);
        } catch (Exception e) {
            return dflt;
        }
    }

    public static long toLong(Object o) {
        return toLong(o, 10, 0);
    }

    public static long toLong(Object o, int dflt) {
        return toLong(o, 10, dflt);
    }

    public static long toLong(Object o, int radix, int dflt) {
        if (null == o) // shortcut without exception
            return dflt;
        if (o instanceof Number)
            return ((Number) o).longValue();
        try {
            return Long.parseLong(o.toString().trim(), radix);
        } catch (Exception e) {
            return dflt;
        }
    }

} // class Convert