blob: 1b8a40a6c131eff9fbc53963c5046453f7fc906e [file] [log] [blame]
/**
* 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));
}
}