void read(int page, int offset, int numToRead, byte[] bytes, int bytesOffset)
			throws IOException {

		if (numToRead < 1) {
			throw new IOException("Must request at least one byte in MSF read");
		}

		if (offset < 0 || offset >= msf.getPageSize()) {
			throw new IOException(String.format("Offset must be in range [0, %d) in for MSF read",
				msf.getPageSize()));
		}

		// Calculate true offset within file.
		long fileOffset = offset + page * (long) msf.getPageSize();

		// Fail if file does not contain enough pages for the read--boundary case that assumes
		//  everything beyond the offset in the file belongs to this read.
		if (Msf.floorDivisionWithLog2Divisor(offset + numToRead, msf.getLog2PageSize()) > msf
				.getNumPages()) {
			throw new IOException("Invalid MSF configuration");
		}

		System.arraycopy(byteProvider.readBytes(fileOffset, numToRead), 0, bytes, bytesOffset,
			numToRead);
	}
Reads bytes from the {@link Msf} into a byte[]
@param page the page number within which to start the read
@param offset the byte offset within the page to start the read
@param numToRead the total number of bytes to read
@param bytes the byte[] into which the data is to be written
@param bytesOffset the starting offset within the bytes array in which to start writing
@throws IOException on file seek or read, invalid parameters, bad file configuration, or
 inability to read required bytes
Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb2/pdbreader/msf/MsfFileReader.java