Although this won't help us decode a QR code by hand it's important to note that machines read differently from us. Typically in case of damage, a QR reader will use error correction bytes to fix a damaged message.
The percentages given represent the surface % of damage that a QR can whitstand before becoming unreadable
Each QR is affected to one of the eight possible mask pattern types
The mask patterns can be generated from their respective operations using [i,j] as the coordinate of each square. If the result of the operation is 0 then the square should be black, otherwise it should be white.
The unmasked QR can be calculated by substracting the original QR (1) to its mask pattern (2)
In the example above we unmask the bottom-right 2x2 block of the QR. A white block in the mask pattern means no change, a block one means we should invert the original color.
Once the QR is unmasked, the first 2x2 block gives us the data type
The QR code is then divided into blocks of 2x4 squares to be read sequentially in a zig zag pattern Each block is assigned a value by counting the black squares and adding their coefficients according to the blocks orientation
up
down
up to left
down to left
The remaining blocks each correspond to a character of the encoded message. All that is left to do is look up the sums of each block inside an ASCII table