001 package com.imagero.uio.xform;
002
003 /**
004 * Date: 10.01.2008
005 *
006 * @author Andrey Kuznetsov
007 */
008 public class ByteToXLE {
009 /**
010 * write int in LITTLE_ENDIAN order
011 *
012 * @param source source byte array
013 * @param sourceOffset offset in source array
014 * @param destOffset offset in destination array
015 *
016 * @return new offset in source array (for next writeUnitXX)
017 */
018 public static final int byteToInt(byte[] source, int sourceOffset, int[] dest, int destOffset) {
019 int v = ((source[sourceOffset++] & 0xFF))
020 | (((source[sourceOffset++] & 0xFF)) << 8)
021 | (((source[sourceOffset++] & 0xFF)) << 16)
022 | (((source[sourceOffset++] & 0xFF)) << 24);
023 dest[destOffset] = v;
024 return sourceOffset;
025 }
026
027 public static final int byteToInt(byte[] source, int sourceOffset) {
028 return ((source[sourceOffset++] & 0xFF))
029 | (((source[sourceOffset++] & 0xFF)) << 8)
030 | (((source[sourceOffset++] & 0xFF)) << 16)
031 | (((source[sourceOffset++] & 0xFF)) << 24);
032 }
033
034 public static final void byteToInt(byte[] source, int sourceOffset, int count, int[] dest, int destOffset) {
035 for (int i = 0; i < count; i++) {
036 int v = ((source[sourceOffset++] & 0xFF))
037 | (((source[sourceOffset++] & 0xFF)) << 8)
038 | (((source[sourceOffset++] & 0xFF)) << 16)
039 | (((source[sourceOffset++] & 0xFF)) << 24);
040 dest[destOffset + i] = v;
041 }
042 }
043
044 public static int byteToChar(byte[] source, int sourceOffset, char[] dest, int destOffset) {
045 int v = ((source[sourceOffset++] & 0xFF)) | (((source[sourceOffset++] & 0xFF)) << 8);
046 dest[destOffset] = (char) v;
047 return sourceOffset;
048 }
049
050 public static int byteToChar(byte[] source, int sourceOffset) {
051 return ((source[sourceOffset++] & 0xFF)) | (((source[sourceOffset++] & 0xFF)) << 8);
052 }
053
054 public static void byteToChar(byte[] source, int sourceOffset, int count, char[] dest, int destOffset) {
055 for (int i = 0; i < count; i++) {
056 int v = ((source[sourceOffset++] & 0xFF)) | (((source[sourceOffset++] & 0xFF)) << 8);
057 dest[destOffset + i] = (char) v;
058 }
059 }
060
061 public static int byteToDoubleLE(byte[] source, int sourceOffset, double[] dest, int destOffset) {
062 long v = (source[sourceOffset++] & 0xFF)
063 | ((long) (source[sourceOffset++] & 0xFF) << 8)
064 | ((long) (source[sourceOffset++] & 0xFF) << 16)
065 | ((long) (source[sourceOffset++] & 0xFF) << 24)
066 | ((long) (source[sourceOffset++] & 0xFF) << 32)
067 | ((long) (source[sourceOffset++] & 0xFF) << 40)
068 | ((long) (source[sourceOffset++] & 0xFF) << 48)
069 | ((long) (source[sourceOffset++] & 0xFF) << 56);
070 dest[destOffset] = Double.longBitsToDouble(v);
071 return sourceOffset;
072 }
073
074 public static double byteToDoubleLE(byte[] source, int sourceOffset) {
075 long v = (source[sourceOffset++] & 0xFF)
076 | ((long) (source[sourceOffset++] & 0xFF) << 8)
077 | ((long) (source[sourceOffset++] & 0xFF) << 16)
078 | ((long) (source[sourceOffset++] & 0xFF) << 24)
079 | ((long) (source[sourceOffset++] & 0xFF) << 32)
080 | ((long) (source[sourceOffset++] & 0xFF) << 40)
081 | ((long) (source[sourceOffset++] & 0xFF) << 48)
082 | ((long) (source[sourceOffset++] & 0xFF) << 56);
083 return Double.longBitsToDouble(v);
084 }
085
086 public static void byteToDoubleLE(byte[] source, int sourceOffset, int count, double[] dest, int destOffset) {
087 for (int i = 0; i < count; i++) {
088 long v = (source[sourceOffset++] & 0xFF)
089 | ((long) (source[sourceOffset++] & 0xFF) << 8)
090 | ((long) (source[sourceOffset++] & 0xFF) << 16)
091 | ((long) (source[sourceOffset++] & 0xFF) << 24)
092 | ((long) (source[sourceOffset++] & 0xFF) << 32)
093 | ((long) (source[sourceOffset++] & 0xFF) << 40)
094 | ((long) (source[sourceOffset++] & 0xFF) << 48)
095 | ((long) (source[sourceOffset++] & 0xFF) << 56);
096 dest[destOffset + i] = Double.longBitsToDouble(v);
097 }
098 }
099
100 public static int byteToFloatLE(byte[] source, int sourceOffset, float[] dest, int destOffset) {
101 int v = ((source[sourceOffset++] & 0xFF))
102 | (((source[sourceOffset++] & 0xFF)) << 8)
103 | (((source[sourceOffset++] & 0xFF)) << 16)
104 | (((source[sourceOffset++] & 0xFF)) << 24);
105 dest[destOffset] = Float.intBitsToFloat(v);
106 return sourceOffset;
107 }
108
109 public static float byteToFloatLE(byte[] source, int sourceOffset) {
110 int v = ((source[sourceOffset++] & 0xFF))
111 | (((source[sourceOffset++] & 0xFF)) << 8)
112 | (((source[sourceOffset++] & 0xFF)) << 16)
113 | (((source[sourceOffset++] & 0xFF)) << 24);
114 return Float.intBitsToFloat(v);
115 }
116
117 public static void byteToFloatLE(byte[] source, int sourceOffset, int count, float[] dest, int destOffset) {
118 for (int i = 0; i < count; i++) {
119 int v = ((source[sourceOffset++] & 0xFF))
120 | (((source[sourceOffset++] & 0xFF)) << 8)
121 | (((source[sourceOffset++] & 0xFF)) << 16)
122 | (((source[sourceOffset++] & 0xFF)) << 24);
123 dest[destOffset + i] = Float.intBitsToFloat(v);
124 }
125 }
126
127 public static int byteToLongLE(byte[] source, int sourceOffset, long[] dest, int destOffset) {
128 long v = (source[sourceOffset++] & 0xFF)
129 | ((long) (source[sourceOffset++] & 0xFF) << 8)
130 | ((long) (source[sourceOffset++] & 0xFF) << 16)
131 | ((long) (source[sourceOffset++] & 0xFF) << 24)
132 | ((long) (source[sourceOffset++] & 0xFF) << 32)
133 | ((long) (source[sourceOffset++] & 0xFF) << 40)
134 | ((long) (source[sourceOffset++] & 0xFF) << 48)
135 | ((long) (source[sourceOffset++] & 0xFF) << 56);
136 dest[destOffset] = v;
137 return sourceOffset;
138 }
139
140 public static long byteToLongLE(byte[] source, int sourceOffset) {
141 return (source[sourceOffset++] & 0xFF)
142 | ((long) (source[sourceOffset++] & 0xFF) << 8)
143 | ((long) (source[sourceOffset++] & 0xFF) << 16)
144 | ((long) (source[sourceOffset++] & 0xFF) << 24)
145 | ((long) (source[sourceOffset++] & 0xFF) << 32)
146 | ((long) (source[sourceOffset++] & 0xFF) << 40)
147 | ((long) (source[sourceOffset++] & 0xFF) << 48)
148 | ((long) (source[sourceOffset++] & 0xFF) << 56);
149 }
150
151 public static void byteToLongLE(byte[] source, int sourceOffset, int count, long[] dest, int destOffset) {
152 for (int i = 0; i < count; i++) {
153 long v = (source[sourceOffset++] & 0xFF)
154 | ((long) (source[sourceOffset++] & 0xFF) << 8)
155 | ((long) (source[sourceOffset++] & 0xFF) << 16)
156 | ((long) (source[sourceOffset++] & 0xFF) << 24)
157 | ((long) (source[sourceOffset++] & 0xFF) << 32)
158 | ((long) (source[sourceOffset++] & 0xFF) << 40)
159 | ((long) (source[sourceOffset++] & 0xFF) << 48)
160 | ((long) (source[sourceOffset++] & 0xFF) << 56);
161 dest[destOffset + i] = v;
162 }
163 }
164
165 public static int byteToShortLE(byte[] source, int sourceOffset, short[] dest, int destOffset) {
166 int v = ((source[sourceOffset++] & 0xFF))
167 | (((source[sourceOffset++] & 0xFF)) << 8);
168 dest[destOffset] = (short) v;
169 return sourceOffset;
170 }
171
172 public static int byteToShortLE(byte[] source, int sourceOffset) {
173 return ((source[sourceOffset++] & 0xFF)) | (((source[sourceOffset++] & 0xFF)) << 8);
174 }
175
176 public static void byteToShortLE(byte[] source, int sourceOffset, int count, short[] dest, int destOffset) {
177 for (int i = 0; i < count; i++) {
178 int v = ((source[sourceOffset++] & 0xFF))
179 | (((source[sourceOffset++] & 0xFF)) << 8);
180 dest[destOffset + i] = (short) v;
181 }
182 }
183
184 public static final void byteToIntLE(final int bytesInInt, byte[] source, int sourceOffset, final int count, int[] dest, int destOffset) {
185 for (int i = 0; i < count; i++) {
186 int v = 0;
187 for (int j = 0, shift = 0; j < bytesInInt; j++) {
188 v = v | ((source[sourceOffset + j] & 0xFF) << shift);
189 shift += 8;
190 }
191 dest[destOffset++] = v & 0xFFFFFFFF;
192 sourceOffset += bytesInInt;
193 }
194 }
195
196 public static final void byteToShortLE(final int bytesInShort, byte[] source, int sourceOffset, final int count, short[] dest, int destOffset) {
197 for (int i = 0; i < count; i++) {
198 int v = 0;
199 for (int j = 0, shift = 0; j < bytesInShort; j++) {
200 v = v | ((source[sourceOffset + j] & 0xFF) << shift);
201 shift += 8;
202 }
203 dest[destOffset++] = (short) v;
204 sourceOffset += bytesInShort;
205 }
206 }
207
208 public static final void byteToLongLE(final int bytesInLong, byte[] source, int sourceOffset, final int count, long[] dest, int destOffset) {
209 for (int i = 0; i < count; i++) {
210 long v = 0;
211 for (int j = 0, shift = 0; j < bytesInLong; j++) {
212 v = v | ((source[sourceOffset + j] & 0xFF) << shift);
213 shift += 8;
214 }
215 dest[destOffset++] = v;
216 sourceOffset += bytesInLong;
217 }
218 }
219
220 public static final int byteToIntLE(int bytesInInt, byte[] source, int sourceOffset, int[] dest, int destOffset) {
221 int v = 0;
222 for (int i = 0, shift = 0; i < bytesInInt; i++) {
223 v = v | ((source[sourceOffset++] & 0xFF) << shift);
224 shift += 8;
225 }
226 dest[destOffset] = v & 0xFFFFFFFF;
227 return sourceOffset;
228 }
229
230 public static final int byteToShortLE(int bytesInShort, byte[] source, int sourceOffset, short[] dest, int destOffset) {
231 int v = 0;
232 for (int i = 0, shift = 0; i < bytesInShort; i++) {
233 v = v | ((source[sourceOffset++] & 0xFF) << shift);
234 shift += 8;
235 }
236 dest[destOffset] = (short) v;
237 return sourceOffset;
238 }
239
240 public static final int byteToLongLE(int bytesInLong, byte[] source, int sourceOffset, long[] dest, int destOffset) {
241 long v = 0;
242 for (int i = 0, shift = 0; i < bytesInLong; i++) {
243 v = v | ((source[sourceOffset++] & 0xFF) << shift);
244 shift += 8;
245 }
246 dest[destOffset] = v;
247 return sourceOffset;
248 }
249 }