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 }