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    }