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