Mega Code Archive

 
Categories / Java / Data Type
 

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