Conversion utilities
/* * 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