private void initialiseInverseBWT (final int bwtStartPointer) throws IOException {

		final byte[] bwtBlock  = this.bwtBlock;
		final int[] bwtMergedPointers = new int[this.bwtBlockLength];
		final int[] characterBase = new int[256];

		if ((bwtStartPointer < 0) || (bwtStartPointer >= this.bwtBlockLength)) {
			throw new BZip2Exception ("BZip2 start pointer invalid");
		}

		// Cumulatise character counts
		System.arraycopy (this.bwtByteCounts, 0, characterBase, 1, 255);
		for (int i = 2; i <= 255; i++) {
			characterBase[i] += characterBase[i - 1];
		}

		// Merged-Array Inverse Burrows-Wheeler Transform
		// Combining the output characters and forward pointers into a single array here, where we
		// have already read both of the corresponding values, cuts down on memory accesses in the
		// final walk through the array
		for (int i = 0; i < this.bwtBlockLength; i++) {
			int value = bwtBlock[i] & 0xff;
			bwtMergedPointers[characterBase[value]++] = (i << 8) + value;
		}

		this.bwtBlock = null;
		this.bwtMergedPointers = bwtMergedPointers;
		this.bwtCurrentMergedPointer = bwtMergedPointers[bwtStartPointer];

	}