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    }