private static void addFromArray(int[] blockNums, int start, int end, int indirectLevel,
			RangeMappedByteProvider ebp, int blockSize, long expectedLength, ByteProvider provider)
			throws IOException {
		BinaryReader reader = new BinaryReader(provider, true /* LE */ );
		for (int i = start; i < end && ebp.length() < expectedLength; i++) {
			if ( indirectLevel > 0 ) {
				int[] subBlockNumbers = reader.readIntArray(blockNums[i] * blockSize,
					blockSize / BinaryReader.SIZEOF_INT);
				addFromArray(subBlockNumbers, 0, subBlockNumbers.length, indirectLevel - 1, ebp,
					blockSize, expectedLength, provider);
			}
			else {
				int bytesFromBlock = (int) Math.min(blockSize, expectedLength - ebp.length());
				long blockNum = Integer.toUnsignedLong(blockNums[i]);
				ebp.addRange(blockNum == 0 ? -1 : blockNum * blockSize, bytesFromBlock);
			}
		}
	}
Creates a {@link RangeMappedByteProvider} from the old-style block map data found in the
inode's i_block field.
  
@param rawIBlockBytes raw bytes from the inode's i_block
@param provider the file system volume provider
@param expectedLength the length the file should be (from the inode)
@param blockSize file system blockSize 
@param fsrl {@link FSRL} to assign to the new ByteProvider
@return new {@link ByteProvider} containing the blocks of the volume that were specified
by the blockmap data
@throws IOException if error
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/ext4/Ext4BlockMapHelper.java