001 /**
002 * JDBM LICENSE v1.00
003 *
004 * Redistribution and use of this software and associated documentation
005 * ("Software"), with or without modification, are permitted provided
006 * that the following conditions are met:
007 *
008 * 1. Redistributions of source code must retain copyright
009 * statements and notices. Redistributions must also contain a
010 * copy of this document.
011 *
012 * 2. Redistributions in binary form must reproduce the
013 * above copyright notice, this list of conditions and the
014 * following disclaimer in the documentation and/or other
015 * materials provided with the distribution.
016 *
017 * 3. The name "JDBM" must not be used to endorse or promote
018 * products derived from this Software without prior written
019 * permission of Cees de Groot. For written permission,
020 * please contact cg@cdegroot.com.
021 *
022 * 4. Products derived from this Software may not be called "JDBM"
023 * nor may "JDBM" appear in their names without prior written
024 * permission of Cees de Groot.
025 *
026 * 5. Due credit should be given to the JDBM Project
027 * (http://jdbm.sourceforge.net/).
028 *
029 * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS
030 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
031 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
032 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
033 * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
034 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
035 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
036 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
037 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
038 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
039 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
040 * OF THE POSSIBILITY OF SUCH DAMAGE.
041 *
042 * Copyright 2001 (C) Alex Boisvert. All Rights Reserved.
043 * Contributions are Copyright (C) 2001 by their associated contributors.
044 *
045 */
046
047 package jdbm.helper;
048
049 import org.apache.directory.server.i18n.I18n;
050
051
052 /**
053 * Miscelaneous conversion utility methods.
054 *
055 * @author <a href="mailto:boisvert@intalio.com">Alex Boisvert</a>
056 * @version $Id: Conversion.java,v 1.3 2002/05/31 06:33:20 boisvert Exp $
057 */
058 public class Conversion
059 {
060
061 /**
062 * Convert a string into a byte array.
063 */
064 public static byte[] convertToByteArray( String s )
065 {
066 try {
067 // see the following page for character encoding
068 // http://java.sun.com/products/jdk/1.1/docs/guide/intl/encoding.doc.html
069 return s.getBytes( "UTF8" );
070 } catch ( java.io.UnsupportedEncodingException uee ) {
071 uee.printStackTrace();
072 throw new Error( I18n.err( I18n.ERR_527 ) );
073 }
074 }
075
076
077 /**
078 * Convert a byte into a byte array.
079 */
080 public static byte[] convertToByteArray( byte n )
081 {
082 n = (byte)( n ^ ( (byte) 0x80 ) ); // flip MSB because "byte" is signed
083 return new byte[] { n };
084 }
085
086
087 /**
088 * Convert a short into a byte array.
089 */
090 public static byte[] convertToByteArray( short n )
091 {
092 n = (short) ( n ^ ( (short) 0x8000 ) ); // flip MSB because "short" is signed
093 byte[] key = new byte[ 2 ];
094 pack2( key, 0, n );
095 return key;
096 }
097
098
099 /**
100 * Convert an int into a byte array.
101 */
102 public static byte[] convertToByteArray( int n )
103 {
104 n = (n ^ 0x80000000); // flip MSB because "int" is signed
105 byte[] key = new byte[4];
106 pack4(key, 0, n);
107 return key;
108 }
109
110
111 /**
112 * Convert a long into a byte array.
113 */
114 public static byte[] convertToByteArray( long n )
115 {
116 n = (n ^ 0x8000000000000000L); // flip MSB because "long" is signed
117 byte[] key = new byte[8];
118 pack8( key, 0, n );
119 return key;
120 }
121
122
123 /**
124 * Convert a byte array (encoded as UTF-8) into a String
125 */
126 public static String convertToString( byte[] buf )
127 {
128 try {
129 // see the following page for character encoding
130 // http://java.sun.com/products/jdk/1.1/docs/guide/intl/encoding.doc.html
131 return new String( buf, "UTF8" );
132 } catch ( java.io.UnsupportedEncodingException uee ) {
133 uee.printStackTrace();
134 throw new Error( I18n.err( I18n.ERR_527 ) );
135 }
136 }
137
138
139 /**
140 * Convert a byte array into an integer (signed 32-bit) value.
141 */
142 public static int convertToInt( byte[] buf )
143 {
144 int value = unpack4( buf, 0 );
145 value = ( value ^ 0x80000000 ); // flip MSB because "int" is signed
146 return value;
147 }
148
149
150 /**
151 * Convert a byte array into a long (signed 64-bit) value.
152 */
153 public static long convertToLong( byte[] buf )
154 {
155 long value = ( (long) unpack4( buf, 0 ) << 32 )
156 + ( unpack4( buf, 4 ) & 0xFFFFFFFFL );
157 value = ( value ^ 0x8000000000000000L ); // flip MSB because "long" is signed
158 return value;
159 }
160
161
162
163
164 static int unpack4( byte[] buf, int offset )
165 {
166 int value = ( buf[ offset ] << 24 )
167 | ( ( buf[ offset+1 ] << 16 ) & 0x00FF0000 )
168 | ( ( buf[ offset+2 ] << 8 ) & 0x0000FF00 )
169 | ( ( buf[ offset+3 ] << 0 ) & 0x000000FF );
170
171 return value;
172 }
173
174
175 static final void pack2( byte[] data, int offs, int val )
176 {
177 data[offs++] = (byte) ( val >> 8 );
178 data[offs++] = (byte) val;
179 }
180
181
182 static final void pack4( byte[] data, int offs, int val )
183 {
184 data[offs++] = (byte) ( val >> 24 );
185 data[offs++] = (byte) ( val >> 16 );
186 data[offs++] = (byte) ( val >> 8 );
187 data[offs++] = (byte) val;
188 }
189
190
191 static final void pack8( byte[] data, int offs, long val )
192 {
193 pack4( data, 0, (int) ( val >> 32 ) );
194 pack4( data, 4, (int) val );
195 }
196
197
198 /**
199 * Test static methods
200 */
201 public static void main( String[] args )
202 {
203 byte[] buf;
204
205 buf = convertToByteArray( (int) 5 );
206 System.out.println( "int value of 5 is: " + convertToInt( buf ) );
207
208 buf = convertToByteArray( (int) -1 );
209 System.out.println( "int value of -1 is: " + convertToInt( buf ) );
210
211 buf = convertToByteArray( (int) 22111000 );
212 System.out.println( "int value of 22111000 is: " + convertToInt( buf ) );
213
214
215 buf = convertToByteArray( (long) 5L );
216 System.out.println( "long value of 5 is: " + convertToLong( buf ) );
217
218 buf = convertToByteArray( (long) -1L );
219 System.out.println( "long value of -1 is: " + convertToLong( buf ) );
220
221 buf = convertToByteArray( (long) 1112223334445556667L );
222 System.out.println( "long value of 1112223334445556667 is: " + convertToLong( buf ) );
223 }
224
225 }