001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.activemq.util;
018    
019    import java.io.IOException;
020    
021    /**
022     * Used to write and read primitives to and from a ByteSequence.
023     */
024    public final class ByteSequenceData {
025    
026        private ByteSequenceData() {    
027        }
028        
029        public static byte[] toByteArray(ByteSequence packet) {
030            if (packet.offset == 0 && packet.length == packet.data.length) {
031                return packet.data;
032            }
033    
034            byte rc[] = new byte[packet.length];
035            System.arraycopy(packet.data, packet.offset, rc, 0, packet.length);
036            return rc;
037        }
038    
039        private static void spaceNeeded(ByteSequence packet, int i) {
040            assert packet.offset + i <= packet.length;
041        }
042    
043        public static int remaining(ByteSequence packet) {
044            return packet.length - packet.offset;
045        }
046    
047        public static int read(ByteSequence packet) {
048            return packet.data[packet.offset++] & 0xff;
049        }
050    
051        public static void readFully(ByteSequence packet, byte[] b) throws IOException {
052            readFully(packet, b, 0, b.length);
053        }
054    
055        public static void readFully(ByteSequence packet, byte[] b, int off, int len) throws IOException {
056            spaceNeeded(packet, len);
057            System.arraycopy(packet.data, packet.offset, b, off, len);
058            packet.offset += len;
059        }
060    
061        public static int skipBytes(ByteSequence packet, int n) throws IOException {
062            int rc = Math.min(n, remaining(packet));
063            packet.offset += rc;
064            return rc;
065        }
066    
067        public static boolean readBoolean(ByteSequence packet) throws IOException {
068            spaceNeeded(packet, 1);
069            return read(packet) != 0;
070        }
071    
072        public static byte readByte(ByteSequence packet) throws IOException {
073            spaceNeeded(packet, 1);
074            return (byte)read(packet);
075        }
076    
077        public static int readUnsignedByte(ByteSequence packet) throws IOException {
078            spaceNeeded(packet, 1);
079            return read(packet);
080        }
081    
082        public static short readShortBig(ByteSequence packet) throws IOException {
083            spaceNeeded(packet, 2);
084            return (short)((read(packet) << 8) + (read(packet) << 0));
085        }
086    
087        public static short readShortLittle(ByteSequence packet) throws IOException {
088            spaceNeeded(packet, 2);
089            return (short)((read(packet) << 0) + (read(packet) << 8));
090        }
091    
092        public static int readUnsignedShortBig(ByteSequence packet) throws IOException {
093            spaceNeeded(packet, 2);
094            return (read(packet) << 8) + (read(packet) << 0);
095        }
096    
097        public static int readUnsignedShortLittle(ByteSequence packet) throws IOException {
098            spaceNeeded(packet, 2);
099            return (read(packet) << 0) + (read(packet) << 8);
100        }
101    
102        public static char readCharBig(ByteSequence packet) throws IOException {
103            spaceNeeded(packet, 2);
104            return (char)((read(packet) << 8) + (read(packet) << 0));
105        }
106    
107        public static char readCharLittle(ByteSequence packet) throws IOException {
108            spaceNeeded(packet, 2);
109            return (char)((read(packet) << 0) + (read(packet) << 8));
110        }
111    
112        public static int readIntBig(ByteSequence packet) throws IOException {
113            spaceNeeded(packet, 4);
114            return (read(packet) << 24) + (read(packet) << 16) + (read(packet) << 8) + (read(packet) << 0);
115        }
116    
117        public static int readIntLittle(ByteSequence packet) throws IOException {
118            spaceNeeded(packet, 4);
119            return (read(packet) << 0) + (read(packet) << 8) + (read(packet) << 16) + (read(packet) << 24);
120        }
121    
122        public static long readLongBig(ByteSequence packet) throws IOException {
123            spaceNeeded(packet, 8);
124            return ((long)read(packet) << 56) + ((long)read(packet) << 48) + ((long)read(packet) << 40) + ((long)read(packet) << 32) + ((long)read(packet) << 24)
125                    + ((read(packet)) << 16) + ((read(packet)) << 8) + ((read(packet)) << 0);
126        }
127    
128        public static long readLongLittle(ByteSequence packet) throws IOException {
129            spaceNeeded(packet, 8);
130            return (read(packet) << 0) + (read(packet) << 8) + (read(packet) << 16) + ((long)read(packet) << 24) + ((long)read(packet) << 32) + ((long)read(packet) << 40)
131                    + ((long)read(packet) << 48) + ((long)read(packet) << 56);
132        }
133    
134        public static double readDoubleBig(ByteSequence packet) throws IOException {
135            return Double.longBitsToDouble(readLongBig(packet));
136        }
137    
138        public static double readDoubleLittle(ByteSequence packet) throws IOException {
139            return Double.longBitsToDouble(readLongLittle(packet));
140        }
141    
142        public static float readFloatBig(ByteSequence packet) throws IOException {
143            return Float.intBitsToFloat(readIntBig(packet));
144        }
145    
146        public static float readFloatLittle(ByteSequence packet) throws IOException {
147            return Float.intBitsToFloat(readIntLittle(packet));
148        }
149    
150        public static void write(ByteSequence packet, int b) throws IOException {
151            spaceNeeded(packet, 1);
152            packet.data[packet.offset++] = (byte)b;
153        }
154    
155        public static void write(ByteSequence packet, byte[] b) throws IOException {
156            write(packet, b, 0, b.length);
157        }
158    
159        public static void write(ByteSequence packet, byte[] b, int off, int len) throws IOException {
160            spaceNeeded(packet, len);
161            System.arraycopy(b, off, packet.data, packet.offset, len);
162            packet.offset += len;
163        }
164    
165        public static void writeBoolean(ByteSequence packet, boolean v) throws IOException {
166            spaceNeeded(packet, 1);
167            write(packet, v ? 1 : 0);
168        }
169    
170        public static void writeByte(ByteSequence packet, int v) throws IOException {
171            spaceNeeded(packet, 1);
172            write(packet, v);
173        }
174    
175        public static void writeShortBig(ByteSequence packet, int v) throws IOException {
176            spaceNeeded(packet, 2);
177            write(packet, (v >>> 8) & 0xFF);
178            write(packet, (v >>> 0) & 0xFF);
179        }
180    
181        public static void writeShortLittle(ByteSequence packet, int v) throws IOException {
182            spaceNeeded(packet, 2);
183            write(packet, (v >>> 0) & 0xFF);
184            write(packet, (v >>> 8) & 0xFF);
185        }
186    
187        public static void writeCharBig(ByteSequence packet, int v) throws IOException {
188            spaceNeeded(packet, 2);
189            write(packet, (v >>> 8) & 0xFF);
190            write(packet, (v >>> 0) & 0xFF);
191        }
192    
193        public static void writeCharLittle(ByteSequence packet, int v) throws IOException {
194            spaceNeeded(packet, 2);
195            write(packet, (v >>> 0) & 0xFF);
196            write(packet, (v >>> 8) & 0xFF);
197        }
198    
199        public static void writeIntBig(ByteSequence packet, int v) throws IOException {
200            spaceNeeded(packet, 4);
201            write(packet, (v >>> 24) & 0xFF);
202            write(packet, (v >>> 16) & 0xFF);
203            write(packet, (v >>> 8) & 0xFF);
204            write(packet, (v >>> 0) & 0xFF);
205        }
206    
207        public static void writeIntLittle(ByteSequence packet, int v) throws IOException {
208            spaceNeeded(packet, 4);
209            write(packet, (v >>> 0) & 0xFF);
210            write(packet, (v >>> 8) & 0xFF);
211            write(packet, (v >>> 16) & 0xFF);
212            write(packet, (v >>> 24) & 0xFF);
213        }
214    
215        public static void writeLongBig(ByteSequence packet, long v) throws IOException {
216            spaceNeeded(packet, 8);
217            write(packet, (int)(v >>> 56) & 0xFF);
218            write(packet, (int)(v >>> 48) & 0xFF);
219            write(packet, (int)(v >>> 40) & 0xFF);
220            write(packet, (int)(v >>> 32) & 0xFF);
221            write(packet, (int)(v >>> 24) & 0xFF);
222            write(packet, (int)(v >>> 16) & 0xFF);
223            write(packet, (int)(v >>> 8) & 0xFF);
224            write(packet, (int)(v >>> 0) & 0xFF);
225        }
226    
227        public static void writeLongLittle(ByteSequence packet, long v) throws IOException {
228            spaceNeeded(packet, 8);
229            write(packet, (int)(v >>> 0) & 0xFF);
230            write(packet, (int)(v >>> 8) & 0xFF);
231            write(packet, (int)(v >>> 16) & 0xFF);
232            write(packet, (int)(v >>> 24) & 0xFF);
233            write(packet, (int)(v >>> 32) & 0xFF);
234            write(packet, (int)(v >>> 40) & 0xFF);
235            write(packet, (int)(v >>> 48) & 0xFF);
236            write(packet, (int)(v >>> 56) & 0xFF);
237        }
238    
239        public static void writeDoubleBig(ByteSequence packet, double v) throws IOException {
240            writeLongBig(packet, Double.doubleToLongBits(v));
241        }
242    
243        public static void writeDoubleLittle(ByteSequence packet, double v) throws IOException {
244            writeLongLittle(packet, Double.doubleToLongBits(v));
245        }
246    
247        public static void writeFloatBig(ByteSequence packet, float v) throws IOException {
248            writeIntBig(packet, Float.floatToIntBits(v));
249        }
250    
251        public static void writeFloatLittle(ByteSequence packet, float v) throws IOException {
252            writeIntLittle(packet, Float.floatToIntBits(v));
253        }
254    
255        public static void writeRawDoubleBig(ByteSequence packet, double v) throws IOException {
256            writeLongBig(packet, Double.doubleToRawLongBits(v));
257        }
258    
259        public static void writeRawDoubleLittle(ByteSequence packet, double v) throws IOException {
260            writeLongLittle(packet, Double.doubleToRawLongBits(v));
261        }
262    
263        public static void writeRawFloatBig(ByteSequence packet, float v) throws IOException {
264            writeIntBig(packet, Float.floatToRawIntBits(v));
265        }
266    
267        public static void writeRawFloatLittle(ByteSequence packet, float v) throws IOException {
268            writeIntLittle(packet, Float.floatToRawIntBits(v));
269        }
270    
271    }