/** * Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior * University * * Licensed 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.openflow.util; import java.math.BigInteger; import java.nio.ByteBuffer; /***** * A util library class for dealing with the lack of unsigned datatypes in Java * * @author Rob Sherwood (rob.sherwood@stanford.edu) * @author David Erickson (daviderickson@cs.stanford.edu) */ public class Unsigned { /** * Get an unsigned byte from the current position of the ByteBuffer * * @param bb ByteBuffer to get the byte from * @return an unsigned byte contained in a short */ public static short getUnsignedByte(ByteBuffer bb) { return ((short) (bb.get() & (short) 0xff)); } /** * Get an unsigned byte from the specified offset in the ByteBuffer * * @param bb ByteBuffer to get the byte from * @param offset the offset to get the byte from * @return an unsigned byte contained in a short */ public static short getUnsignedByte(ByteBuffer bb, int offset) { return ((short) (bb.get(offset) & (short) 0xff)); } /** * Put an unsigned byte into the specified ByteBuffer at the current * position * * @param bb ByteBuffer to put the byte into * @param v the short containing the unsigned byte */ public static void putUnsignedByte(ByteBuffer bb, short v) { bb.put((byte) (v & 0xff)); } /** * Put an unsigned byte into the specified ByteBuffer at the specified * offset * * @param bb ByteBuffer to put the byte into * @param v the short containing the unsigned byte * @param offset the offset to insert the unsigned byte at */ public static void putUnsignedByte(ByteBuffer bb, short v, int offset) { bb.put(offset, (byte) (v & 0xff)); } /** * Get an unsigned short from the current position of the ByteBuffer * * @param bb ByteBuffer to get the byte from * @return an unsigned short contained in a int */ public static int getUnsignedShort(ByteBuffer bb) { return (bb.getShort() & 0xffff); } /** * Get an unsigned short from the specified offset in the ByteBuffer * * @param bb ByteBuffer to get the short from * @param offset the offset to get the short from * @return an unsigned short contained in a int */ public static int getUnsignedShort(ByteBuffer bb, int offset) { return (bb.getShort(offset) & 0xffff); } /** * Put an unsigned short into the specified ByteBuffer at the current * position * * @param bb ByteBuffer to put the short into * @param v the int containing the unsigned short */ public static void putUnsignedShort(ByteBuffer bb, int v) { bb.putShort((short) (v & 0xffff)); } /** * Put an unsigned short into the specified ByteBuffer at the specified * offset * * @param bb ByteBuffer to put the short into * @param v the int containing the unsigned short * @param offset the offset to insert the unsigned short at */ public static void putUnsignedShort(ByteBuffer bb, int v, int offset) { bb.putShort(offset, (short) (v & 0xffff)); } /** * Get an unsigned int from the current position of the ByteBuffer * * @param bb ByteBuffer to get the int from * @return an unsigned int contained in a long */ public static long getUnsignedInt(ByteBuffer bb) { return ((long) bb.getInt() & 0xffffffffL); } /** * Get an unsigned int from the specified offset in the ByteBuffer * * @param bb ByteBuffer to get the int from * @param offset the offset to get the int from * @return an unsigned int contained in a long */ public static long getUnsignedInt(ByteBuffer bb, int offset) { return ((long) bb.getInt(offset) & 0xffffffffL); } /** * Put an unsigned int into the specified ByteBuffer at the current position * * @param bb ByteBuffer to put the int into * @param v the long containing the unsigned int */ public static void putUnsignedInt(ByteBuffer bb, long v) { bb.putInt((int) (v & 0xffffffffL)); } /** * Put an unsigned int into the specified ByteBuffer at the specified offset * * @param bb ByteBuffer to put the int into * @param v the long containing the unsigned int * @param offset the offset to insert the unsigned int at */ public static void putUnsignedInt(ByteBuffer bb, long v, int offset) { bb.putInt(offset, (int) (v & 0xffffffffL)); } /** * Get an unsigned long from the current position of the ByteBuffer * * @param bb ByteBuffer to get the long from * @return an unsigned long contained in a BigInteger */ public static BigInteger getUnsignedLong(ByteBuffer bb) { byte[] v = new byte[8]; for (int i = 0; i < 8; ++i) { v[i] = bb.get(i); } return new BigInteger(1, v); } /** * Get an unsigned long from the specified offset in the ByteBuffer * * @param bb ByteBuffer to get the long from * @param offset the offset to get the long from * @return an unsigned long contained in a BigInteger */ public static BigInteger getUnsignedLong(ByteBuffer bb, int offset) { byte[] v = new byte[8]; for (int i = 0; i < 8; ++i) { v[i] = bb.get(offset+i); } return new BigInteger(1, v); } /** * Put an unsigned long into the specified ByteBuffer at the current * position * * @param bb ByteBuffer to put the long into * @param v the BigInteger containing the unsigned long */ public static void putUnsignedLong(ByteBuffer bb, BigInteger v) { bb.putLong(v.longValue()); } /** * Put an unsigned long into the specified ByteBuffer at the specified * offset * * @param bb ByteBuffer to put the long into * @param v the BigInteger containing the unsigned long * @param offset the offset to insert the unsigned long at */ public static void putUnsignedLong(ByteBuffer bb, BigInteger v, int offset) { bb.putLong(offset, v.longValue()); } }