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 }