| /** |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.activemq.util; |
| |
| import java.io.IOException; |
| |
| /** |
| * Used to write and read primitives to and from a ByteSequence. |
| */ |
| public final class ByteSequenceData { |
| |
| private ByteSequenceData() { |
| } |
| |
| public static byte[] toByteArray(ByteSequence packet) { |
| if (packet.offset == 0 && packet.length == packet.data.length) { |
| return packet.data; |
| } |
| |
| byte rc[] = new byte[packet.length]; |
| System.arraycopy(packet.data, packet.offset, rc, 0, packet.length); |
| return rc; |
| } |
| |
| private static void spaceNeeded(ByteSequence packet, int i) { |
| assert packet.offset + i <= packet.length; |
| } |
| |
| public static int remaining(ByteSequence packet) { |
| return packet.length - packet.offset; |
| } |
| |
| public static int read(ByteSequence packet) { |
| return packet.data[packet.offset++] & 0xff; |
| } |
| |
| public static void readFully(ByteSequence packet, byte[] b) throws IOException { |
| readFully(packet, b, 0, b.length); |
| } |
| |
| public static void readFully(ByteSequence packet, byte[] b, int off, int len) throws IOException { |
| spaceNeeded(packet, len); |
| System.arraycopy(packet.data, packet.offset, b, off, len); |
| packet.offset += len; |
| } |
| |
| public static int skipBytes(ByteSequence packet, int n) throws IOException { |
| int rc = Math.min(n, remaining(packet)); |
| packet.offset += rc; |
| return rc; |
| } |
| |
| public static boolean readBoolean(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 1); |
| return read(packet) != 0; |
| } |
| |
| public static byte readByte(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 1); |
| return (byte)read(packet); |
| } |
| |
| public static int readUnsignedByte(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 1); |
| return read(packet); |
| } |
| |
| public static short readShortBig(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 2); |
| return (short)((read(packet) << 8) + (read(packet) << 0)); |
| } |
| |
| public static short readShortLittle(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 2); |
| return (short)((read(packet) << 0) + (read(packet) << 8)); |
| } |
| |
| public static int readUnsignedShortBig(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 2); |
| return (read(packet) << 8) + (read(packet) << 0); |
| } |
| |
| public static int readUnsignedShortLittle(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 2); |
| return (read(packet) << 0) + (read(packet) << 8); |
| } |
| |
| public static char readCharBig(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 2); |
| return (char)((read(packet) << 8) + (read(packet) << 0)); |
| } |
| |
| public static char readCharLittle(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 2); |
| return (char)((read(packet) << 0) + (read(packet) << 8)); |
| } |
| |
| public static int readIntBig(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 4); |
| return (read(packet) << 24) + (read(packet) << 16) + (read(packet) << 8) + (read(packet) << 0); |
| } |
| |
| public static int readIntLittle(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 4); |
| return (read(packet) << 0) + (read(packet) << 8) + (read(packet) << 16) + (read(packet) << 24); |
| } |
| |
| public static long readLongBig(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 8); |
| return ((long)read(packet) << 56) + ((long)read(packet) << 48) + ((long)read(packet) << 40) + ((long)read(packet) << 32) + ((long)read(packet) << 24) |
| + ((read(packet)) << 16) + ((read(packet)) << 8) + ((read(packet)) << 0); |
| } |
| |
| public static long readLongLittle(ByteSequence packet) throws IOException { |
| spaceNeeded(packet, 8); |
| return (read(packet) << 0) + (read(packet) << 8) + (read(packet) << 16) + ((long)read(packet) << 24) + ((long)read(packet) << 32) + ((long)read(packet) << 40) |
| + ((long)read(packet) << 48) + ((long)read(packet) << 56); |
| } |
| |
| public static double readDoubleBig(ByteSequence packet) throws IOException { |
| return Double.longBitsToDouble(readLongBig(packet)); |
| } |
| |
| public static double readDoubleLittle(ByteSequence packet) throws IOException { |
| return Double.longBitsToDouble(readLongLittle(packet)); |
| } |
| |
| public static float readFloatBig(ByteSequence packet) throws IOException { |
| return Float.intBitsToFloat(readIntBig(packet)); |
| } |
| |
| public static float readFloatLittle(ByteSequence packet) throws IOException { |
| return Float.intBitsToFloat(readIntLittle(packet)); |
| } |
| |
| public static void write(ByteSequence packet, int b) throws IOException { |
| spaceNeeded(packet, 1); |
| packet.data[packet.offset++] = (byte)b; |
| } |
| |
| public static void write(ByteSequence packet, byte[] b) throws IOException { |
| write(packet, b, 0, b.length); |
| } |
| |
| public static void write(ByteSequence packet, byte[] b, int off, int len) throws IOException { |
| spaceNeeded(packet, len); |
| System.arraycopy(b, off, packet.data, packet.offset, len); |
| packet.offset += len; |
| } |
| |
| public static void writeBoolean(ByteSequence packet, boolean v) throws IOException { |
| spaceNeeded(packet, 1); |
| write(packet, v ? 1 : 0); |
| } |
| |
| public static void writeByte(ByteSequence packet, int v) throws IOException { |
| spaceNeeded(packet, 1); |
| write(packet, v); |
| } |
| |
| public static void writeShortBig(ByteSequence packet, int v) throws IOException { |
| spaceNeeded(packet, 2); |
| write(packet, (v >>> 8) & 0xFF); |
| write(packet, (v >>> 0) & 0xFF); |
| } |
| |
| public static void writeShortLittle(ByteSequence packet, int v) throws IOException { |
| spaceNeeded(packet, 2); |
| write(packet, (v >>> 0) & 0xFF); |
| write(packet, (v >>> 8) & 0xFF); |
| } |
| |
| public static void writeCharBig(ByteSequence packet, int v) throws IOException { |
| spaceNeeded(packet, 2); |
| write(packet, (v >>> 8) & 0xFF); |
| write(packet, (v >>> 0) & 0xFF); |
| } |
| |
| public static void writeCharLittle(ByteSequence packet, int v) throws IOException { |
| spaceNeeded(packet, 2); |
| write(packet, (v >>> 0) & 0xFF); |
| write(packet, (v >>> 8) & 0xFF); |
| } |
| |
| public static void writeIntBig(ByteSequence packet, int v) throws IOException { |
| spaceNeeded(packet, 4); |
| write(packet, (v >>> 24) & 0xFF); |
| write(packet, (v >>> 16) & 0xFF); |
| write(packet, (v >>> 8) & 0xFF); |
| write(packet, (v >>> 0) & 0xFF); |
| } |
| |
| public static void writeIntLittle(ByteSequence packet, int v) throws IOException { |
| spaceNeeded(packet, 4); |
| write(packet, (v >>> 0) & 0xFF); |
| write(packet, (v >>> 8) & 0xFF); |
| write(packet, (v >>> 16) & 0xFF); |
| write(packet, (v >>> 24) & 0xFF); |
| } |
| |
| public static void writeLongBig(ByteSequence packet, long v) throws IOException { |
| spaceNeeded(packet, 8); |
| write(packet, (int)(v >>> 56) & 0xFF); |
| write(packet, (int)(v >>> 48) & 0xFF); |
| write(packet, (int)(v >>> 40) & 0xFF); |
| write(packet, (int)(v >>> 32) & 0xFF); |
| write(packet, (int)(v >>> 24) & 0xFF); |
| write(packet, (int)(v >>> 16) & 0xFF); |
| write(packet, (int)(v >>> 8) & 0xFF); |
| write(packet, (int)(v >>> 0) & 0xFF); |
| } |
| |
| public static void writeLongLittle(ByteSequence packet, long v) throws IOException { |
| spaceNeeded(packet, 8); |
| write(packet, (int)(v >>> 0) & 0xFF); |
| write(packet, (int)(v >>> 8) & 0xFF); |
| write(packet, (int)(v >>> 16) & 0xFF); |
| write(packet, (int)(v >>> 24) & 0xFF); |
| write(packet, (int)(v >>> 32) & 0xFF); |
| write(packet, (int)(v >>> 40) & 0xFF); |
| write(packet, (int)(v >>> 48) & 0xFF); |
| write(packet, (int)(v >>> 56) & 0xFF); |
| } |
| |
| public static void writeDoubleBig(ByteSequence packet, double v) throws IOException { |
| writeLongBig(packet, Double.doubleToLongBits(v)); |
| } |
| |
| public static void writeDoubleLittle(ByteSequence packet, double v) throws IOException { |
| writeLongLittle(packet, Double.doubleToLongBits(v)); |
| } |
| |
| public static void writeFloatBig(ByteSequence packet, float v) throws IOException { |
| writeIntBig(packet, Float.floatToIntBits(v)); |
| } |
| |
| public static void writeFloatLittle(ByteSequence packet, float v) throws IOException { |
| writeIntLittle(packet, Float.floatToIntBits(v)); |
| } |
| |
| public static void writeRawDoubleBig(ByteSequence packet, double v) throws IOException { |
| writeLongBig(packet, Double.doubleToRawLongBits(v)); |
| } |
| |
| public static void writeRawDoubleLittle(ByteSequence packet, double v) throws IOException { |
| writeLongLittle(packet, Double.doubleToRawLongBits(v)); |
| } |
| |
| public static void writeRawFloatBig(ByteSequence packet, float v) throws IOException { |
| writeIntBig(packet, Float.floatToRawIntBits(v)); |
| } |
| |
| public static void writeRawFloatLittle(ByteSequence packet, float v) throws IOException { |
| writeIntLittle(packet, Float.floatToRawIntBits(v)); |
| } |
| |
| } |