transferring bytes from one ByteBuffer to another

前端 未结 3 1027
无人及你
无人及你 2021-01-02 23:41

What\'s the most efficient way to put as many bytes as possible from a ByteBuffer bbuf_src into another ByteBuffer bbuf_dest (as well as know how m

3条回答
  •  天命终不由人
    2021-01-03 00:30

    OK, I've adapted @Richard's answer:

    public static int transferAsMuchAsPossible(
                         ByteBuffer bbuf_dest, ByteBuffer bbuf_src)
    {
      int nTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
      if (nTransfer > 0)
      {
        bbuf_dest.put(bbuf_src.array(), 
                      bbuf_src.arrayOffset()+bbuf_src.position(), 
                      nTransfer);
        bbuf_src.position(bbuf_src.position()+nTransfer);
      }
      return nTransfer;
    }
    

    and a test to make sure it works:

    public static boolean transferTest()
    {
        ByteBuffer bb1 = ByteBuffer.allocate(256);
        ByteBuffer bb2 = ByteBuffer.allocate(50);
        for (int i = 0; i < 100; ++i)
        {
            bb1.put((byte)i);
        }
        bb1.flip();
        bb1.position(5);
        ByteBuffer bb1a = bb1.slice();
        bb1a.position(2);
        // bb3 includes the 5-100 range
        bb2.put((byte)77);
        // something to see this works when bb2 isn't empty
        int n = transferAsMuchAsPossible(bb2, bb1a);
        boolean itWorked = (n == 49);
    
        if (bb1a.position() != 51)
            itWorked = false;
        if (bb2.position() != 50)
            itWorked = false;
        bb2.rewind();
        if (bb2.get() != 77)
            itWorked = false;
        for (int i = 0; i < 49; ++i)
        {
            if (bb2.get() != i+7)
            {
                itWorked = false;
                break;
            }
        }
        return itWorked;
    }
    

提交回复
热议问题