View Javadoc

1   /*
2    * $HeadURL: /cvsroot/insight/Insight/remote-protocol/src/com/mindtree/insight/remoteprotocol/PacketDataSizeOverLimitsException.java,v $
3    * $Date: 2005/08/09 18:39:17 $
4    * $Revision: 1.1 $
5    * $Author: m1001025 $
6    * 
7    * Copyright (c) 2005 MindTree Consulting Ltd. 
8    * 
9    * This file is part of Insight Remote Protocol Library.
10   * 
11   * Insight Remote Protocol Library is free software: you can redistribute it 
12   * and/or modify it under the terms of the GNU General Public License as 
13   * published by the Free Software Foundation, either version 3 of the License, 
14   * or (at your option) any later version.
15   * 
16   * Insight Remote Protocol Library is distributed in the hope that it will be 
17   * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General 
19   * Public License for more details.
20   * 
21   * You should have received a copy of the GNU General Public License along with 
22   * Insight Remote Protocol Library.  If not, see <http://www.gnu.org/licenses/>.
23   */
24  package com.mindtree.techworks.insight.remoteprotocol.util;
25  
26  import java.nio.ByteBuffer;
27  import java.nio.CharBuffer;
28  import java.nio.charset.CharacterCodingException;
29  import java.nio.charset.Charset;
30  import java.nio.charset.CharsetDecoder;
31  import java.nio.charset.CharsetEncoder;
32  
33  /**
34   * Util class for byte manipulation.
35   * 
36   * @author <a href="mailto:bindul_bhowmik@mindtree.com">Bindul Bhowmik</a>
37   * @version $Revision: $ $Date: $
38   */
39  public class ByteUtils {
40  
41  	/**
42  	 * Reads a <code>short</code> value from a byte array.
43  	 * 
44  	 * @param inputArr
45  	 *            The byte array to read data from
46  	 * @param offset
47  	 *            The offset to read data from
48  	 * @return The short read from the array
49  	 * @throws ArrayIndexOutOfBoundsException
50  	 *             If data cannot be read from specified position
51  	 */
52  	public static short readShortFromByteArray(byte[] inputArr, int offset) {
53  
54  		short returnShort = 0;
55  
56  		returnShort = (short) (returnShort | (inputArr[offset] & 0xFF));
57  		returnShort = (short) (returnShort << 8 | (inputArr[offset + 1] & 0XFF));
58  
59  		return returnShort;
60  	}
61  
62  	/**
63  	 * Reads an <code>int</code> value from a byte array.
64  	 * 
65  	 * @param inputArr
66  	 *            The byte array to read data from
67  	 * @param offset
68  	 *            The offset to read data from
69  	 * @return The int read from the array
70  	 * @throws ArrayIndexOutOfBoundsException
71  	 *             If data cannot be read from specified position
72  	 */
73  	public static int readIntFromByteArray(byte[] inputArr, int offset) {
74  
75  		int returnInt = 0;
76  
77  		returnInt = returnInt | (inputArr[offset] & 0xFF);
78  		returnInt = (returnInt << 8) | (inputArr[offset + 1] & 0xFF);
79  		returnInt = (returnInt << 8) | (inputArr[offset + 2] & 0xFF);
80  		returnInt = (returnInt << 8) | (inputArr[offset + 3] & 0xFF);
81  
82  		return returnInt;
83  	}
84  
85  	/**
86  	 * Creates a byte array for a <code>short</code>. The returned array
87  	 * always has 2 elements.
88  	 * 
89  	 * @param valueToConvert
90  	 *            The short value to convert
91  	 * @return The byte array containing the two bytes of the short. The size is
92  	 *         always 2.
93  	 */
94  	public static byte[] getByteArrayForShort(short valueToConvert) {
95  
96  		byte[] returnVal = new byte[2];
97  
98  		putBytesInArrayForShort(valueToConvert, returnVal, 0);
99  
100 		return returnVal;
101 	}
102 
103 	/**
104 	 * Creates a byte array for a <code>short</code>. The array values are
105 	 * placed in the input array <code>buf</code> from the position specified
106 	 * by the <code>offset</code>.
107 	 * 
108 	 * @param valueToConvert
109 	 *            The short value to convert
110 	 * @param buf
111 	 *            The buffer to place the bytes in
112 	 * @param offset
113 	 *            The offset to insert the values from
114 	 * @throws ArrayIndexOutOfBoundsException
115 	 *             If the specified position in the array is not available.
116 	 */
117 	public static void putBytesInArrayForShort(short valueToConvert,
118 			byte[] buf, int offset) {
119 
120 		buf[offset] = (byte) ((valueToConvert >> 8) & 0x00FF);
121 		buf[offset + 1] = (byte) (valueToConvert & 0x00FF);
122 	}
123 
124 	/**
125 	 * Creates a byte array for an <code>int</code>. The returned array
126 	 * always has 4 elements.
127 	 * 
128 	 * @param valueToConvert
129 	 *            The integer value to convert
130 	 * @return The byte array containing the four bytes of the integer. The size
131 	 *         is always 4.
132 	 */
133 	public static byte[] getByteArrayForInt(int valueToConvert) {
134 
135 		byte[] returnVal = new byte[4];
136 
137 		putBytesInArrayForInt(valueToConvert, returnVal, 0);
138 
139 		return returnVal;
140 	}
141 
142 	/**
143 	 * Creates a byte array for an <code>int</code>. The array values are
144 	 * placed in the input array <code>buf</code> from the position specified
145 	 * by the <code>offset</code>.
146 	 * 
147 	 * @param valueToConvert
148 	 *            The integer value to convert
149 	 * @param buf
150 	 *            The buffer to place the bytes in
151 	 * @param offset
152 	 *            The offset to insert the values from
153 	 * @throws ArrayIndexOutOfBoundsException
154 	 *             If the specified position in the array is not available.
155 	 */
156 	public static void putBytesInArrayForInt(int valueToConvert, byte[] buf,
157 			int offset) {
158 
159 		buf[offset] = (byte) ((valueToConvert >> 24) & 0x00FF);
160 		buf[offset + 1] = (byte) ((valueToConvert >> 16) & 0x00FF);
161 		buf[offset + 2] = (byte) ((valueToConvert >> 8) & 0x00FF);
162 		buf[offset + 3] = (byte) (valueToConvert & 0x00FF);
163 	}
164 
165 	/**
166 	 * Creates a byte array representing the Input String. Every character is
167 	 * represented in two bytes. This method is same as calling
168 	 * <code>{@link #getByteArrayForCharacterArray(char[]) #getByteArrayForCharacterArray(char[])}</code>
169 	 * method with the character array representing the string.
170 	 * 
171 	 * @param inputString
172 	 *            The input string to convert
173 	 * @return A byte array for the string.
174 	 * @throws CharacterCodingException
175 	 *             If there is an exception encoding the characters.
176 	 */
177 	public static byte[] getByteArrayForString(String inputString)
178 			throws CharacterCodingException {
179 
180 		return getByteArrayForCharacterArray(inputString.toCharArray());
181 	}
182 
183 	/**
184 	 * Creates a byte array representing the input character array. The size of
185 	 * the array returned is twice that of the array input.
186 	 * 
187 	 * @param inputArray
188 	 *            The array to convert
189 	 * @return An array containing the bytes for the characters
190 	 * @throws CharacterCodingException
191 	 *             If there is an exception encoding the characters.
192 	 */
193 	public static byte[] getByteArrayForCharacterArray(char[] inputArray)
194 			throws CharacterCodingException {
195 
196 		CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder();
197 		CharBuffer charBuffer = CharBuffer.wrap(inputArray);
198 		ByteBuffer encodedChars = encoder.encode(charBuffer);
199 
200 		byte[] returnArray = new byte[encodedChars.limit()];
201 		encodedChars.get(returnArray);
202 
203 		return returnArray;
204 	}
205 
206 	/**
207 	 * Decodes a string value from the byte Array passed in.
208 	 * 
209 	 * @param inputArr
210 	 *            The input array
211 	 * @param offset
212 	 *            The position to start reading from
213 	 * @param length
214 	 *            The length to read upto
215 	 * @return The string read
216 	 * @throws CharacterCodingException
217 	 *             If there is an exception decoding the characters.
218 	 */
219 	public static String readStringFromByteArray(byte[] inputArr, int offset,
220 			int length) throws CharacterCodingException {
221 
222 		CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
223 		ByteBuffer inputBuffer = ByteBuffer.wrap(inputArr, offset, length);
224 		CharBuffer result = decoder.decode(inputBuffer);
225 
226 		return result.toString();
227 	}
228 }