public static ByteProvider getByteProvider(byte[] rawIBlockBytes, ByteProvider provider,
			long expectedLength, int blockSize, FSRL fsrl) throws IOException {
		BinaryReader iBlockReader =
			new BinaryReader(new ByteArrayProvider(rawIBlockBytes), true /* LE */);
		int[] blockNumbers = iBlockReader.readNextIntArray(INODE_BLOCKMAP_COUNT);

		RangeMappedByteProvider bp = new RangeMappedByteProvider(provider, fsrl);

		// the location of the first 12 blocks of the file are held in [0..11] 
		addFromArray(blockNumbers, 0, INDIRECT_BLOCK_INDEX, 0, bp, blockSize, expectedLength,
			provider);

		// the location of the next blockSize/4 (ie. 4096/4=1024) blocks of the file are
		// held in an array that is located in the block pointed to by [12]
		addFromArray(blockNumbers, INDIRECT_BLOCK_INDEX, DOUBLE_INDIRECT_BLOCK_INDEX, 1, bp,
			blockSize, expectedLength, provider);

		// the location of the next blocks of the file are held in an array that is 
		// double-ly indirectly pointed to by [13]
		addFromArray(blockNumbers, DOUBLE_INDIRECT_BLOCK_INDEX, TRIPLE_INDIRECT_BLOCK_INDEX, 2, bp,
			blockSize, expectedLength, provider);

		// the location of the next blocks of the file are held in an array that is 
		// triply indirectly pointed to by [14]
		addFromArray(blockNumbers, TRIPLE_INDIRECT_BLOCK_INDEX, INODE_BLOCKMAP_COUNT, 3, bp,
			blockSize, expectedLength, provider);

		return bp;
	}
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