@Override
	public synchronized void get(int offset, byte[] data, int dataOffset, int length)
			throws IndexOutOfBoundsException, IOException {
		if (dataBufferIdTable == null) {
			throw new AssertException("Invalid Buffer");
		}
		if (offset < 0 || (offset + length - 1) >= size) {
			throw new IndexOutOfBoundsException();
		}
		if (data.length < dataOffset + length) {
			throw new IndexOutOfBoundsException();
		}
		int index = offset / dataSpace;
		int bufferDataOffset = offset % dataSpace;
		int len = length;
		while (len > 0) {
			int n = getBytes(offset, index++, bufferDataOffset, data, dataOffset, len);
			dataOffset += n;
			offset += n;
			len -= n;
			bufferDataOffset = 0;
		}
	}
Get byte data from the specified chained buffer.
@param offset ChainedBuffer offset (needed for uninitialized buffer pass-through)
@param index buffer index within chain
@param bufferDataOffset data offset within specified buffer
@param data destination byte array
@param dataOffset destination array offset within data
@param length number of bytes to read
@return int actual number of byte read.
This could be smaller than length if the end of buffer is 
encountered while reading data.
@throws IndexOutOfBoundsException if an invalid offset, dataOffset, or length is specified.
@throws IOException thrown if IO error occurs
Ghidra/Framework/DB/src/main/java/db/ChainedBuffer.java