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