X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=third-party%2Fopenflowj%2Fsrc%2Fmain%2Fjava%2Forg%2Fopenflow%2Futil%2FUnsigned.java;fp=third-party%2Fopenflowj%2Fsrc%2Fmain%2Fjava%2Forg%2Fopenflow%2Futil%2FUnsigned.java;h=f2e40e6473e3f8ce529d95ff92d89df8ed7319a7;hb=42210c03b0a4c54706320ba9f55794c0abd4d201;hp=0000000000000000000000000000000000000000;hpb=7576b38152b393793b1c9ec3df0ff86685f95236;p=controller.git diff --git a/third-party/openflowj/src/main/java/org/openflow/util/Unsigned.java b/third-party/openflowj/src/main/java/org/openflow/util/Unsigned.java new file mode 100644 index 0000000000..f2e40e6473 --- /dev/null +++ b/third-party/openflowj/src/main/java/org/openflow/util/Unsigned.java @@ -0,0 +1,195 @@ +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()); + } +}