package aQute.lib.io;

import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;

public class ByteBufferInputStream extends InputStream {
	private final ByteBuffer bb;

	public ByteBufferInputStream(ByteBuffer buffer) {
		buffer.mark();
		bb = buffer;
	}

	@Override
	public int read() throws IOException {
		if (!bb.hasRemaining()) {
			return -1;
		}
		return bb.get();
	}

	@Override
	public int read(byte[] b, int off, int len) throws IOException {
		int remaining = bb.remaining();
		if (remaining <= 0) {
			return -1;
		}
		int length = Math.min(len, remaining);
		bb.get(b, off, length);
		return length;
	}

	@Override
	public long skip(long n) throws IOException {
		if (n <= 0L) {
			return 0L;
		}
		int skipped = Math.min((int) n, bb.remaining());
		bb.position(bb.position() + skipped);
		return skipped;
	}

	@Override
	public int available() throws IOException {
		return bb.remaining();
	}

	@Override
	public void close() throws IOException {
		bb.position(bb.limit());
	}

	@Override
	public synchronized void mark(int readlimit) {
		bb.mark();
	}

	@Override
	public synchronized void reset() throws IOException {
		bb.reset();
	}

	@Override
	public boolean markSupported() {
		return true;
	}
}

package aQute.lib.io;

import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;

public class ByteBufferInputStream extends InputStream {
	private final ByteBuffer bb;

	public ByteBufferInputStream(ByteBuffer buffer) {
		buffer.mark();
		bb = buffer;
	}

	@Override
	public int read() throws IOException {
		if (!bb.hasRemaining()) {
			return -1;
		}
		return 0xFF & bb.get();
	}

	@Override
	public int read(byte[] b, int off, int len) throws IOException {
		int remaining = bb.remaining();
		if (remaining <= 0) {
			return -1;
		}
		int length = Math.min(len, remaining);
		bb.get(b, off, length);
		return length;
	}

	@Override
	public long skip(long n) throws IOException {
		if (n <= 0L) {
			return 0L;
		}
		int skipped = Math.min((int) n, bb.remaining());
		bb.position(bb.position() + skipped);
		return skipped;
	}

	@Override
	public int available() throws IOException {
		return bb.remaining();
	}

	@Override
	public void close() throws IOException {
		bb.position(bb.limit());
	}

	@Override
	public synchronized void mark(int readlimit) {
		bb.mark();
	}

	@Override
	public synchronized void reset() throws IOException {
		bb.reset();
	}

	@Override
	public boolean markSupported() {
		return true;
	}
}

Return byte as unsigned value 0-255