Class Bits

java.lang.Object
org.jgroups.util.Bits

public final class Bits extends Object
Class (similar to (and partly copied from) java.nio.Bits) containing helper methods to encode variables (e.g. ints, long, List<Address> etc) to memory (byte buffer) or output streams and read variables from memory or input streams.

The write methods write a type (e.g. an int or a char) to a buffer (ByteBuffer or output stream, using variable-length encoding. If there are not enough byte in the buffer to write a type, a BufferOverflowException is thrown. If the variable cannot be written to the output stream, an IOException is thrown.

The read methods read a variable-length encoded type from a buffer or input stream. If there are fewer bytes in the buffer than needed to read the type, a BufferUnderflowException is thrown. If the read fails, an IOException is thrown.

The size() methods return the number of bytes used to encode the given type with variable-length encoding.

There are additional helper methods to write/read custom JGroups types, e.g. address lists, Views etc

Note that methods to read/write atomic types (char, int etc) should only be used if variable-length encoding is desired; otherwise DataOutput.writeInt(int) or ByteBuffer.putInt(int) should be used instead.

At the time of writing this (Feb 2014), most methods have not yet been implemented.

Since:
3.5
  • Constructor Details

    • Bits

      private Bits()
  • Method Details

    • writeChar

      public static void writeChar(char c, byte[] buf, int offset)
    • readChar

      public static char readChar(byte[] buf, int offset)
    • readChar

      public static char readChar(ByteBuffer buf)
    • makeChar

      private static char makeChar(byte b1, byte b0)
    • writeShort

      public static void writeShort(short s, byte[] buf, int offset)
    • readShort

      public static short readShort(byte[] buf, int offset)
    • readShort

      public static short readShort(ByteBuffer buf)
    • makeShort

      public static short makeShort(byte a, byte b)
    • writeInt

      public static void writeInt(int num, byte[] buf, int offset)
    • readInt

      public static int readInt(byte[] buf, int offset)
    • readInt

      public static int readInt(ByteBuffer buf)
    • writeIntCompressed

      public static void writeIntCompressed(int num, byte[] buf, int offset)
    • readIntCompressed

      public static int readIntCompressed(byte[] buf, int offset)
    • writeIntCompressed

      public static void writeIntCompressed(int num, ByteBuffer buf)
    • readIntCompressed

      public static int readIntCompressed(ByteBuffer buf)
    • writeIntCompressed

      public static void writeIntCompressed(int num, DataOutput out) throws IOException
      Throws:
      IOException
    • readIntCompressed

      public static int readIntCompressed(DataInput in) throws IOException
      Throws:
      IOException
    • makeInt

      public static int makeInt(ByteBuffer buffer, int bytes_to_read)
    • makeInt

      public static int makeInt(DataInput in, int bytes_to_read) throws IOException
      Throws:
      IOException
    • makeInt

      public static int makeInt(byte[] buf, int offset, int bytes_to_read)
    • size

      public static int size(int num)
      Computes the size of a variable-length encoded int
      Parameters:
      num - the int
      Returns:
      the number of bytes needed to variable-length encode num
    • writeLong

      public static void writeLong(long num, byte[] buf, int offset)
    • readLong

      public static long readLong(byte[] buf, int offset)
    • readLong

      public static long readLong(ByteBuffer buf)
    • writeLongCompressed

      public static void writeLongCompressed(long num, byte[] buf, int offset)
    • readLongCompressed

      public static long readLongCompressed(byte[] buf, int offset)
    • writeLongCompressed

      public static void writeLongCompressed(long num, ByteBuffer buf)
    • readLongCompressed

      public static long readLongCompressed(ByteBuffer buf)
    • writeLongCompressed

      public static void writeLongCompressed(long num, DataOutput out) throws IOException
      Writes a long to out in variable-length encoding
      Throws:
      IOException
    • readLongCompressed

      public static long readLongCompressed(DataInput in) throws IOException
      Throws:
      IOException
    • size

      public static int size(long num)
      Computes the size of a variable-length encoded long. Note that this is not currently using variable-length encoding (will be implemented later).
      Parameters:
      num - the long
      Returns:
      the number of bytes needed to variable-length encode num
    • makeLong

      public static long makeLong(byte[] buf, int offset, int bytes_to_read)
    • makeLong

      public static long makeLong(ByteBuffer buffer, int bytes_to_read)
    • makeLong

      public static long makeLong(DataInput in, int bytes_to_read) throws IOException
      Throws:
      IOException
    • writeLongSequence

      public static void writeLongSequence(long hd, long hr, ByteBuffer buf)
      Writes 2 sequence numbers (seqnos) in compressed format to buf. The seqnos are non-negative and hr is guaranteed to be >= hd.

      Once variable-length encoding has been implemented, this method will probably get dropped as we can simply write the 2 longs individually.

      Parameters:
      hd - the highest delivered seqno. Guaranteed to be a positive number
      hr - the highest received seqno. Guaranteed to be a positive number. Greater than or equal to hd
      buf - the buffer to write to
    • writeLongSequence

      public static void writeLongSequence(long hd, long hr, DataOutput out) throws IOException
      Writes 2 sequence numbers (seqnos) in compressed format to an output stream. The seqnos are non-negative and hr is guaranteed to be >= hd.

      Once variable-length encoding has been implemented, this method will probably get dropped as we can simply write the 2 longs individually.

      Parameters:
      hd - the highest delivered seqno. Guaranteed to be a positive number
      hr - the highest received seqno. Guaranteed to be a positive number. Greater than or equal to hd
      out - the output stream to write to
      Throws:
      IOException
    • readLongSequence

      public static void readLongSequence(ByteBuffer buf, long[] seqnos)
      Reads 2 compressed longs from buf into seqnos

      Once variable-length encoding has been implemented, this method will probably get dropped as we can simply read the 2 longs individually.

      Parameters:
      buf - the buffer to read from
      seqnos - the array to read the seqnos into, needs to have a length of 2
    • readLongSequence

      public static void readLongSequence(DataInput in, long[] seqnos, int index) throws IOException
      Reads 2 compressed longs into an array of 2 longs.

      Once variable-length encoding has been implemented, this method will probably get dropped as we can simply read the 2 longs individually.

      Parameters:
      in - the input stream to read from
      seqnos - the array to read the seqnos into, needs to have a length of 2
      index - the index of the first element to be written; the seqnos are written to seqnos[index] and seqnos[index+1]
      Throws:
      IOException
    • size

      public static byte size(long hd, long hr)
    • writeFloat

      public static void writeFloat(float num, byte[] buf, int offset)
    • readFloat

      public static float readFloat(byte[] buf, int offset)
    • writeFloat

      public static void writeFloat(float num, ByteBuffer buf)
    • readFloat

      public static float readFloat(ByteBuffer buf)
    • writeFloat

      public static void writeFloat(float num, DataOutput out) throws IOException
      Throws:
      IOException
    • readFloat

      public static float readFloat(DataInput in) throws IOException
      Throws:
      IOException
    • size

      public static int size(float ignored)
    • writeDouble

      public static void writeDouble(double num, byte[] buf, int offset)
    • readDouble

      public static double readDouble(byte[] buf, int offset)
    • writeDouble

      public static void writeDouble(double num, ByteBuffer buf)
    • readDouble

      public static double readDouble(ByteBuffer buf)
    • writeDouble

      public static void writeDouble(double num, DataOutput out) throws IOException
      Throws:
      IOException
    • readDouble

      public static double readDouble(DataInput in) throws IOException
      Throws:
      IOException
    • size

      public static int size(double num)
      Computes the size of a variable-length encoded double
      Parameters:
      num - the double
      Returns:
      the number of bytes needed to variable-length encode num
    • writeString

      public static void writeString(String s, ByteBuffer buf)
      Writes a string to buf. The length of the string is written first, followed by the chars (as single-byte values). Multi-byte values are truncated: only the lower byte of each multi-byte char is written, similar to DataOutput.writeChars(String).
      Parameters:
      s - the string
      buf - the buffer
    • writeString

      public static void writeString(String s, DataOutput out) throws IOException
      Writes a string to buf. The length of the string is written first, followed by the chars (as single-byte values). Multi-byte values are truncated: only the lower byte of each multi-byte char is written, similar to DataOutput.writeChars(String).
      Parameters:
      s - the string
      out - the output stream
      Throws:
      IOException
    • readString

      public static String readString(ByteBuffer buf)
      Reads a string from buf. The length is read first, followed by the chars. Each char is a single byte
      Parameters:
      buf - the buffer
      Returns:
      the string read from buf
    • readString

      public static String readString(DataInput in) throws IOException
      Reads a string from buf. The length is read first, followed by the chars. Each char is a single byte
      Parameters:
      in - the input stream
      Returns:
      the string read from buf
      Throws:
      IOException
    • sizeUTF

      public static int sizeUTF(String str)
      Measures the number of bytes required to encode a string, taking multibyte characters into account. Measures strings written by DataOutput.writeUTF(String).
      Parameters:
      str - the string
      Returns:
      the number of bytes required for encoding str
    • size

      public static int size(String str)
    • writeAsciiString

      public static void writeAsciiString(AsciiString s, ByteBuffer buf)
      Writes an AsciiString to buf. The length of the string is written first, followed by the chars (as single-byte values).
      Parameters:
      s - the string
      buf - the buffer
    • writeAsciiString

      public static void writeAsciiString(AsciiString s, DataOutput out) throws IOException
      Writes an AsciiString to buf. The length of the string is written first, followed by the chars (as single-byte values).
      Parameters:
      s - the string
      out - the output stream
      Throws:
      IOException
    • readAsciiString

      public static AsciiString readAsciiString(ByteBuffer buf)
      Reads an AsciiString from buf. The length is read first, followed by the chars. Each char is a single byte
      Parameters:
      buf - the buffer
      Returns:
      the string read from buf
    • readAsciiString

      public static AsciiString readAsciiString(DataInput in) throws IOException
      Reads an AsciiString from buf. The length is read first, followed by the chars. Each char is a single byte
      Parameters:
      in - the input stream
      Returns:
      the string read from buf
      Throws:
      IOException
    • size

      public static int size(AsciiString str)
      Measures the number of bytes required to encode an AsciiSring.
      Parameters:
      str - the string
      Returns:
      the number of bytes required for encoding str
    • encodeLength

      protected static byte encodeLength(byte len1, byte len2)
      Encodes the number of bytes needed into a single byte. The first number is encoded in the first nibble (the first 4 bits), the second number in the second nibble
      Parameters:
      len1 - The number of bytes needed to store a long. Must be between 0 and 8
      len2 - The number of bytes needed to store a long. Must be between 0 and 8
      Returns:
      The byte storing the 2 numbers len1 and len2
    • firstNibble

      protected static byte firstNibble(byte len)
    • secondNibble

      protected static byte secondNibble(byte len)
    • bytesRequiredFor

      protected static byte bytesRequiredFor(long number)
    • bytesRequiredFor

      protected static byte bytesRequiredFor(int number)
    • getByteAt

      protected static byte getByteAt(long num, int index)