public static void test1() throws Exception {

    for (int count = 1; count <= 32; count++) {
      System.out.println("Count:" + count);
      byte[] bytes =
          new byte[] {
            (byte) 0x12,
            (byte) 0x34,
            (byte) 0x56,
            (byte) 0x78,
            (byte) 0x9a,
            (byte) 0xbc,
            (byte) 0xde,
            (byte) 0xff
          };
      int total = 8 * 8;

      ByteArrayInputStream bIn = new ByteArrayInputStream(bytes);
      BitInputStream in = new BitInputStream(bIn);

      ByteArrayOutputStream bOut = new ByteArrayOutputStream();
      BitOutputStream out = new BitOutputStream(bOut);

      int bitsRead = 0;
      while (bitsRead <= (total - count)) {
        int val = in.readBits(count);
        out.writeBits(val, count);
        // System.out.println( Integer.toHexString( in.readBits(count) ) );
        bitsRead += count;
      }

      byte[] result = bOut.toByteArray();
      for (int i = 0; i < result.length; i++)
        System.out.print("[" + Integer.toHexString(result[i] & 0xff) + "]");
      System.out.println();
    }
  }
  public static void test2() throws Exception {
    byte[] bytes =
        new byte[] {
          (byte) 0x12,
          (byte) 0x34,
          (byte) 0x56,
          (byte) 0x78,
          (byte) 0x9a,
          (byte) 0xbc,
          (byte) 0xde,
          (byte) 0xff
        };

    ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    BitOutputStream out = new BitOutputStream(bOut);
    for (int i = 0; i < bytes.length; i++) {
      out.writeBits(1, 1);
      out.writeBits(bytes[i], 8);
      out.writeLongBits(0x123456789abcdef0L, 64);
      out.writeLongBits(-1, 64);
      out.writeLongBits(0x80123456789abcdeL, 64);
    }
    out.close();

    byte[] toRead = bOut.toByteArray();
    System.out.println("Written length:" + toRead.length);

    ByteArrayInputStream bIn = new ByteArrayInputStream(toRead);
    BitInputStream in = new BitInputStream(bIn);
    for (int i = 0; i < bytes.length; i++) {
      int test = in.readBits(1);
      int val = in.readBits(8);
      long l1 = in.readLongBits(64);
      long l2 = in.readLongBits(64);
      long l3 = in.readLongBits(64);
      System.out.print("[" + Integer.toHexString(val) + "]");
      System.out.println(
          "("
              + Long.toHexString(l1)
              + ", "
              + Long.toHexString(l2)
              + ", "
              + Long.toHexString(l3)
              + ")");
    }
    System.out.println();
  }