Корзинка
Количество просмотров: 34

Hell `flip()`, или создаем `Long` из `byte[]`

Решили вы это сделать влоб и получили:

Exception in thread "main" java.nio.BufferUnderflowException

`ByteBuffer.allocate(Long.BYTES).putLong(100500L).array() взяты как пример `byte[]`

 

Например код:

Long lTest = ByteBuffer.allocate(8).put(Arrays.copyOfRange(ByteBuffer.allocate(Long.BYTES).putLong(100500L).array(), 0, 8)).getLong();

выдаст

Exception in thread "main" java.nio.BufferUnderflowException
at java.base/java.nio.Buffer.nextGetIndex(Buffer.java:634)
at java.base/java.nio.HeapByteBuffer.getLong(HeapByteBuffer.java:452)

 

А вот такой выдаст корректные 100500:

Long lTest = ByteBuffer.allocate(8).put(Arrays.copyOfRange(ByteBuffer.allocate(Long.BYTES).putLong(100500L).array(), 0, 8)).flip().getLong();

Все дело в использовании метода `flip();`

Вот его описание:

/**
 * Flips this buffer.  The limit is set to the current position and then
 * the position is set to zero.  If the mark is defined then it is
 * discarded.
 *
 * <p> After a sequence of channel-read or <i>put</i> operations, invoke
 * this method to prepare for a sequence of channel-write or relative
 * <i>get</i> operations.  For example:
 *
 * <blockquote><pre>
 * buf.put(magic);    // Prepend header
 * in.read(buf);      // Read data into rest of buffer
 * buf.flip();        // Flip buffer
 * out.write(buf);    // Write header + data to channel</pre></blockquote>
 *
 * <p> This method is often used in conjunction with the {@link
 * java.nio.ByteBuffer#compact compact} method when transferring data from
 * one place to another.  </p>
 *
 * @return  This buffer
 */
public Buffer flip() {
    limit = position;
    position = 0;
    mark = -1;
    return this;
}

Фишка в том, что при использовании весьма удобного `ByteBuffer` необходимо его флипать для чтения. Вот и все.

Facebooktwittergoogle_plusredditpinterestlinkedintumblrFacebooktwittergoogle_plusredditpinterestlinkedintumblr

Comments are closed.