blob: 1256c4b3a18ce666b5da194dd7573466bcd49b6c [file] [log] [blame]
/**
* JDBM LICENSE v1.00
*
* Redistribution and use of this software and associated documentation
* ("Software"), with or without modification, are permitted provided
* that the following conditions are met:
*
* 1. Redistributions of source code must retain copyright
* statements and notices. Redistributions must also contain a
* copy of this document.
*
* 2. Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. The name "JDBM" must not be used to endorse or promote
* products derived from this Software without prior written
* permission of Cees de Groot. For written permission,
* please contact cg@cdegroot.com.
*
* 4. Products derived from this Software may not be called "JDBM"
* nor may "JDBM" appear in their names without prior written
* permission of Cees de Groot.
*
* 5. Due credit should be given to the JDBM Project
* (http://jdbm.sourceforge.net/).
*
* THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
* NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Copyright 2001 (C) Alex Boisvert. All Rights Reserved.
* Contributions are Copyright (C) 2001 by their associated contributors.
*
*/
package jdbm.helper;
/**
* Miscelaneous conversion utility methods.
*
* @author <a href="mailto:boisvert@intalio.com">Alex Boisvert</a>
* @version $Id: Conversion.java,v 1.3 2002/05/31 06:33:20 boisvert Exp $
*/
public class Conversion
{
/**
* Convert a string into a byte array.
*/
public static byte[] convertToByteArray( String s )
{
try {
// see the following page for character encoding
// http://java.sun.com/products/jdk/1.1/docs/guide/intl/encoding.doc.html
return s.getBytes( "UTF8" );
} catch ( java.io.UnsupportedEncodingException uee ) {
uee.printStackTrace();
throw new Error( "Platform doesn't support UTF8 encoding" );
}
}
/**
* Convert a byte into a byte array.
*/
public static byte[] convertToByteArray( byte n )
{
n = (byte)( n ^ ( (byte) 0x80 ) ); // flip MSB because "byte" is signed
return new byte[] { n };
}
/**
* Convert a short into a byte array.
*/
public static byte[] convertToByteArray( short n )
{
n = (short) ( n ^ ( (short) 0x8000 ) ); // flip MSB because "short" is signed
byte[] key = new byte[ 2 ];
pack2( key, 0, n );
return key;
}
/**
* Convert an int into a byte array.
*/
public static byte[] convertToByteArray( int n )
{
n = (n ^ 0x80000000); // flip MSB because "int" is signed
byte[] key = new byte[4];
pack4(key, 0, n);
return key;
}
/**
* Convert a long into a byte array.
*/
public static byte[] convertToByteArray( long n )
{
n = (n ^ 0x8000000000000000L); // flip MSB because "long" is signed
byte[] key = new byte[8];
pack8( key, 0, n );
return key;
}
/**
* Convert a byte array (encoded as UTF-8) into a String
*/
public static String convertToString( byte[] buf )
{
try {
// see the following page for character encoding
// http://java.sun.com/products/jdk/1.1/docs/guide/intl/encoding.doc.html
return new String( buf, "UTF8" );
} catch ( java.io.UnsupportedEncodingException uee ) {
uee.printStackTrace();
throw new Error( "Platform doesn't support UTF8 encoding" );
}
}
/**
* Convert a byte array into an integer (signed 32-bit) value.
*/
public static int convertToInt( byte[] buf )
{
int value = unpack4( buf, 0 );
value = ( value ^ 0x80000000 ); // flip MSB because "int" is signed
return value;
}
/**
* Convert a byte array into a long (signed 64-bit) value.
*/
public static long convertToLong( byte[] buf )
{
long value = ( (long) unpack4( buf, 0 ) << 32 )
+ ( unpack4( buf, 4 ) & 0xFFFFFFFFL );
value = ( value ^ 0x8000000000000000L ); // flip MSB because "long" is signed
return value;
}
static int unpack4( byte[] buf, int offset )
{
int value = ( buf[ offset ] << 24 )
| ( ( buf[ offset+1 ] << 16 ) & 0x00FF0000 )
| ( ( buf[ offset+2 ] << 8 ) & 0x0000FF00 )
| ( ( buf[ offset+3 ] << 0 ) & 0x000000FF );
return value;
}
static final void pack2( byte[] data, int offs, int val )
{
data[offs++] = (byte) ( val >> 8 );
data[offs++] = (byte) val;
}
static final void pack4( byte[] data, int offs, int val )
{
data[offs++] = (byte) ( val >> 24 );
data[offs++] = (byte) ( val >> 16 );
data[offs++] = (byte) ( val >> 8 );
data[offs++] = (byte) val;
}
static final void pack8( byte[] data, int offs, long val )
{
pack4( data, 0, (int) ( val >> 32 ) );
pack4( data, 4, (int) val );
}
/**
* Test static methods
*/
public static void main( String[] args )
{
byte[] buf;
buf = convertToByteArray( (int) 5 );
System.out.println( "int value of 5 is: " + convertToInt( buf ) );
buf = convertToByteArray( (int) -1 );
System.out.println( "int value of -1 is: " + convertToInt( buf ) );
buf = convertToByteArray( (int) 22111000 );
System.out.println( "int value of 22111000 is: " + convertToInt( buf ) );
buf = convertToByteArray( (long) 5L );
System.out.println( "long value of 5 is: " + convertToLong( buf ) );
buf = convertToByteArray( (long) -1L );
System.out.println( "long value of -1 is: " + convertToLong( buf ) );
buf = convertToByteArray( (long) 1112223334445556667L );
System.out.println( "long value of 1112223334445556667 is: " + convertToLong( buf ) );
}
}