@Override
	public synchronized byte getByte(int offset) throws IndexOutOfBoundsException, IOException {
		if (dataBufferIdTable == null) {
			throw new AssertException("Invalid Buffer");
		}
		if (offset < 0 || offset >= size) {
			throw new IndexOutOfBoundsException();
		}
		int index = offset / dataSpace;
		int bufferDataOffset = offset % dataSpace;
		int id = dataBufferIdTable[index];
		if (id < 0) {
			if (uninitializedDataSource != null) {
				return uninitializedDataSource.getByte(uninitializedDataSourceOffset + offset);
			}
			return 0;
		}
		DataBuffer buffer = bufferMgr.getBuffer(id);
		byte b = buffer.getByte(dataBaseOffset + bufferDataOffset);
		bufferMgr.releaseBuffer(buffer);
		if (useXORMask) {
			b = xorMaskByte(bufferDataOffset, b);
		}
		return b;
	}
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