001 package com.imagero.uio.xform;
002
003 import com.imagero.uio.Transformer;
004
005 /**
006 * Date: 10.01.2008
007 *
008 * @author Andrey Kuznetsov
009 */
010 public class XtoByteLE {
011 static final int[] SHIFTS_INT_LE = new int[]{0, 8, 16, 24};
012
013 /**
014 * read int in LITTLE_ENDIAN order
015 *
016 * @param sourceOffset offset in source array
017 * @param dest byte array (destination)
018 * @param destOffset offset in destination array
019 *
020 * @return offset in destination array (updated)
021 */
022 public static final int intToByte(int[] source, int sourceOffset, byte[] dest, int destOffset) {
023 int v = source[sourceOffset];
024 dest[destOffset++] = (byte) (v & 0xFF);
025 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
026 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
027 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
028 return destOffset;
029 }
030
031 public static final int intToByte(int v, byte[] dest, int destOffset) {
032 dest[destOffset++] = (byte) (v & 0xFF);
033 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
034 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
035 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
036 return destOffset;
037 }
038
039 /**
040 * convert <code>count</code> ints to bytes (Little Endian)
041 * @param source int array
042 * @param srcOffset start offset in <code>source</code> array
043 * @param count how much ints to process
044 * @param dest destination byte array
045 * @param destOffset start offset in <code>dest</code> array
046 */
047 public static final void intToByte(int[] source, int srcOffset, int count, byte[] dest, int destOffset) {
048 for (int i = 0; i < count; i++) {
049 int v = source[srcOffset + i];
050 dest[destOffset++] = (byte) (v & 0xFF);
051 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
052 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
053 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
054 }
055 }
056
057 /**
058 * convert <code>count</code> ints to bytes (Little Endian)
059 * @param source int array
060 * @param srcOffset start offset in <code>source</code> array
061 * @param count how much ints to process
062 * @param dest destination byte array
063 * @param destOffset start offset in <code>dest</code> array
064 * @param skip how much bytes should be thrown away before start writing to destination (1 to 3)
065 */
066 public static final void intToByteLE(int[] source, int srcOffset, int count, byte[] dest, int destOffset, int skip) {
067 if (skip > 0) {
068 int v = source[srcOffset++];
069 for (int i = skip; i < 4; i++) {
070 dest[destOffset++] = (byte) ((v >>> SHIFTS_INT_LE[i]) & 0xFF);
071 }
072 }
073 intToByte(source, srcOffset, count, dest, destOffset);
074 }
075
076 public static final int charToByte(char[] source, int srcOffset, byte[] dest, int destOffset) {
077 int v = source[srcOffset];
078 dest[destOffset++] = (byte) (v & 0xFF);
079 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
080 return destOffset;
081 }
082
083 public static final int charToByte(char v, byte[] dest, int destOffset) {
084 dest[destOffset++] = (byte) (v & 0xFF);
085 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
086 return destOffset;
087 }
088
089 public static final void charToByte(char[] source, int srcOffset, int count, byte[] dest, int destOffset) {
090 for (int i = 0; i < count; i++) {
091 int v = source[srcOffset + i];
092 dest[destOffset++] = (byte) (v & 0xFF);
093 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
094 }
095 }
096
097 public static int doubleToByteLE(double[] source, int srcOffset, byte[] dest, int destOffset) {
098 double d = source[srcOffset];
099 long v = Double.doubleToLongBits(d);
100 dest[destOffset++] = (byte) (v & 0xFF);
101 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
102 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
103 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
104 dest[destOffset++] = (byte) ((v >>> 32) & 0xFF);
105 dest[destOffset++] = (byte) ((v >>> 40) & 0xFF);
106 dest[destOffset++] = (byte) ((v >>> 48) & 0xFF);
107 dest[destOffset++] = (byte) ((v >>> 56) & 0xFF);
108 return destOffset;
109 }
110
111 public static int doubleToByteLE(double d, byte[] dest, int destOffset) {
112 long v = Double.doubleToLongBits(d);
113 dest[destOffset++] = (byte) (v & 0xFF);
114 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
115 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
116 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
117 dest[destOffset++] = (byte) ((v >>> 32) & 0xFF);
118 dest[destOffset++] = (byte) ((v >>> 40) & 0xFF);
119 dest[destOffset++] = (byte) ((v >>> 48) & 0xFF);
120 dest[destOffset++] = (byte) ((v >>> 56) & 0xFF);
121 return destOffset;
122 }
123
124 public static void doubleToByteLE(double[] source, int srcOffset, int count, byte[] dest, int destOffset) {
125 for (int i = 0; i < count; i++) {
126 double d = source[srcOffset + i];
127 long v = Double.doubleToLongBits(d);
128 dest[destOffset++] = (byte) (v & 0xFF);
129 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
130 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
131 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
132 dest[destOffset++] = (byte) ((v >>> 32) & 0xFF);
133 dest[destOffset++] = (byte) ((v >>> 40) & 0xFF);
134 dest[destOffset++] = (byte) ((v >>> 48) & 0xFF);
135 dest[destOffset++] = (byte) ((v >>> 56) & 0xFF);
136 }
137 }
138
139 public static int floatToByteLE(float[] source, int offset, byte[] dest, int destOffset) {
140 float f = source[offset];
141 int v = Float.floatToIntBits(f);
142 dest[destOffset++] = (byte) (v & 0xFF);
143 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
144 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
145 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
146 return destOffset;
147 }
148
149 public static int floatToByteLE(float f, byte[] dest, int destOffset) {
150 int v = Float.floatToIntBits(f);
151 dest[destOffset++] = (byte) (v & 0xFF);
152 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
153 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
154 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
155 return destOffset;
156 }
157
158 public static void floatToByteLE(float[] source, int offset, int count, byte[] dest, int destOffset) {
159 for (int i = 0; i < count; i++) {
160 float f = source[offset + i];
161 int v = Float.floatToIntBits(f);
162 dest[destOffset++] = (byte) (v & 0xFF);
163 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
164 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
165 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
166 }
167 }
168
169 public static int longToByteLE(long[] source, int offset, byte[] dest, int destOffset) {
170 long v = source[offset];
171 dest[destOffset++] = (byte) (v & 0xFF);
172 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
173 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
174 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
175 dest[destOffset++] = (byte) ((v >>> 32) & 0xFF);
176 dest[destOffset++] = (byte) ((v >>> 40) & 0xFF);
177 dest[destOffset++] = (byte) ((v >>> 48) & 0xFF);
178 dest[destOffset++] = (byte) ((v >>> 56) & 0xFF);
179
180 return destOffset;
181 }
182
183 public static int longToByteLE(long v, byte[] dest, int destOffset) {
184 dest[destOffset++] = (byte) (v & 0xFF);
185 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
186 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
187 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
188 dest[destOffset++] = (byte) ((v >>> 32) & 0xFF);
189 dest[destOffset++] = (byte) ((v >>> 40) & 0xFF);
190 dest[destOffset++] = (byte) ((v >>> 48) & 0xFF);
191 dest[destOffset++] = (byte) ((v >>> 56) & 0xFF);
192
193 return destOffset;
194 }
195
196 public static void longToByteLE(long[] source, int offset, int count, byte[] dest, int destOffset) {
197 for (int i = 0; i < count; i++) {
198 long v = source[offset + i];
199 dest[destOffset++] = (byte) (v & 0xFF);
200 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
201 dest[destOffset++] = (byte) ((v >>> 16) & 0xFF);
202 dest[destOffset++] = (byte) ((v >>> 24) & 0xFF);
203 dest[destOffset++] = (byte) ((v >>> 32) & 0xFF);
204 dest[destOffset++] = (byte) ((v >>> 40) & 0xFF);
205 dest[destOffset++] = (byte) ((v >>> 48) & 0xFF);
206 dest[destOffset++] = (byte) ((v >>> 56) & 0xFF);
207 }
208 }
209
210 public static int shortToByteLE(short[] source, int offset, byte[] dest, int destOffset) {
211 int v = source[offset];
212 dest[destOffset++] = (byte) (v & 0xFF);
213 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
214 return destOffset;
215 }
216
217 public static int shortToByteLE(short v, byte[] dest, int destOffset) {
218 dest[destOffset++] = (byte) (v & 0xFF);
219 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
220 return destOffset;
221 }
222
223 public static void shortToByteLE(short[] source, int offset, int count, byte[] dest, int destOffset) {
224 for (int i = 0; i < count; i++) {
225 int v = source[offset + i];
226 dest[destOffset++] = (byte) (v & 0xFF);
227 dest[destOffset++] = (byte) ((v >>> 8) & 0xFF);
228 }
229 }
230
231 public static int shortToByteLE(final byte mask, short[] source, int offset, byte[] dest, int destOffset) {
232 int v = source[offset];
233 final int bytesInShort = 2;
234 for (int j = 0; j < bytesInShort; j++) {
235 if ((mask & XtoByteBE.byte_mask[j]) != 0) {
236 dest[destOffset++] = (byte) ((v >>> XtoByteBE.shift_mask[j]) & 0xFF);
237 }
238 }
239 return destOffset;
240 }
241
242 public static void shortToByteLE(final byte mask, short[] source, int offset, int count, byte[] dest, int destOffset) {
243 final int bytesInShort = 2;
244 for (int i = 0; i < count; i++) {
245 int v = source[offset + i];
246 for (int j = 0; j < bytesInShort; j++) {
247 if ((mask & XtoByteBE.byte_mask[j]) != 0) {
248 dest[destOffset++] = (byte) ((v >>> XtoByteBE.shift_mask[j]) & 0xFF);
249 }
250 }
251 }
252 }
253
254 public static int intToByteLE(final byte mask, int[] source, int offset, byte[] dest, int destOffset) {
255 int v = source[offset];
256 final int bytesInInt = 4;
257 for (int j = 0; j < bytesInInt; j++) {
258 if ((mask & XtoByteBE.byte_mask[j]) != 0) {
259 dest[destOffset++] = (byte) ((v >>> XtoByteBE.shift_mask[j]) & 0xFF);
260 }
261 }
262 return destOffset;
263 }
264
265 public static void intToByteLE(final byte mask, int[] source, int offset, int count, byte[] dest, int destOffset) {
266 final int bytesInInt = 4;
267 for (int i = 0; i < count; i++) {
268 int v = source[offset + i];
269 for (int j = 0; j < bytesInInt; j++) {
270 if ((mask & XtoByteBE.byte_mask[j]) != 0) {
271 dest[destOffset++] = (byte) ((v >>> XtoByteBE.shift_mask[j]) & 0xFF);
272 }
273 }
274 }
275 }
276
277 public static int longToByteLE(final byte mask, long[] source, int offset, byte[] dest, int destOffset) {
278 long v = source[offset];
279 final int bytesInLong = 8;
280 for (int j = 0; j < bytesInLong; j++) {
281 if ((mask & XtoByteBE.byte_mask[j]) != 0) {
282 dest[destOffset++] = (byte) ((v >>> XtoByteBE.shift_mask[j]) & 0xFF);
283 }
284 }
285 return destOffset;
286 }
287
288 public static void longToByteLE(final byte mask, long[] source, int offset, int count, byte[] dest, int destOffset) {
289 final int bytesInLong = 8;
290 for (int i = 0; i < count; i++) {
291 long v = source[offset + i];
292 for (int j = 0; j < bytesInLong; j++) {
293 if ((mask & XtoByteBE.byte_mask[j]) != 0) {
294 dest[destOffset++] = (byte) ((v >>> XtoByteBE.shift_mask[j]) & 0xFF);
295 }
296 }
297 }
298 }
299 }