readFormatInformation() {
			if (this.parsedFormatInfo !== null && this.parsedFormatInfo !== undefined) {
				return this.parsedFormatInfo;
			}
			// Read top-left format info bits
			let formatInfoBits1 = 0;
			for (let i = 0; i < 6; i++) {
				formatInfoBits1 = this.copyBit(i, 8, formatInfoBits1);
			}
			// .. and skip a bit in the timing pattern ...
			formatInfoBits1 = this.copyBit(7, 8, formatInfoBits1);
			formatInfoBits1 = this.copyBit(8, 8, formatInfoBits1);
			formatInfoBits1 = this.copyBit(8, 7, formatInfoBits1);
			// .. and skip a bit in the timing pattern ...
			for (let j = 5; j >= 0; j--) {
				formatInfoBits1 = this.copyBit(8, j, formatInfoBits1);
			}
			// Read the top-right/bottom-left pattern too
			const dimension = this.bitMatrix.getHeight();
			let formatInfoBits2 = 0;
			const jMin = dimension - 7;
			for (let j = dimension - 1; j >= jMin; j--) {
				formatInfoBits2 = this.copyBit(8, j, formatInfoBits2);
			}
			for (let i = dimension - 8; i < dimension; i++) {
				formatInfoBits2 = this.copyBit(i, 8, formatInfoBits2);
			}
			this.parsedFormatInfo = FormatInformation.decodeFormatInformation(formatInfoBits1, formatInfoBits2);
			if (this.parsedFormatInfo !== null) {
				return this.parsedFormatInfo;
			}
			throw new FormatException();
		}
<p>Reads format information from one of its two locations within the QR Code.</p>

@return {@link FormatInformation} encapsulating the QR Code's format info
@throws FormatException if both format information locations cannot be parsed as
the valid encoding of format information