Spec & internals
QR code bit stream walkthrough — from text to modules
A QR bit stream is built as mode indicator, character count, encoded data, a 4-bit terminator, then pad bytes 0xEC and 0x11 to fill capacity. Codewords are split into blocks, extended with Reed–Solomon check codewords, interleaved, placed in a zig-zag from the bottom-right corner, masked, and topped with format information.
The pipeline at a glance
segments → terminator → pad bytes → blocks → RS codewords → interleave
→ remainder bits → zig-zag placement → mask → format/version info
Each stage is mechanical; run them in order and any two correct encoders produce the same codewords for the same input, version, and error-correction level. (Divergence enters only at mask selection.)
Stage 1: the data bit stream
Each segment is a 4-bit mode indicator, a character count field (8–16 bits wide depending on mode and version), then the encoded characters. After the last segment come the closing formalities:
- Terminator — up to four
0bits (fewer if capacity runs out exactly). - Pad to a byte boundary with
0s. - Pad bytes — the alternating pair
11101100 00010001(0xEC 0x11) repeated until the version's data capacity is exactly full. The values are not arbitrary: they are balanced bit patterns chosen so padding never creates the uniform areas the penalty rules exist to punish. SpotEC 11 EC 11in a hex dump and you are looking at a QR code's slack space.
Stage 2: codewords, blocks and error correction
The stream is cut into 8-bit codewords and split into the block structure the standard fixes for this version and level. Each block gains its Reed–Solomon check codewords, and the blocks are then interleaved — data codewords round-robin across blocks, then check codewords the same way.
A final oddity: some versions' module counts are not a multiple of 8, so remainder
bits — always 0 — top up the stream: 7 of them for versions 2–6, 3 or 4 for various
versions from 14 to 34, none elsewhere.
Stage 3: placement — the zig-zag
Function patterns claim their territory first; data fills what is left, in a pattern best described as reading a book backwards:
- Placement works in vertical column pairs, two modules wide, starting at the bottom-right corner.
- The first pair fills upward — within each two-module row of the pair, right cell then left cell — until it hits the top, then the next pair to the left fills downward, alternating all the way across.
- Any cell claimed by a function pattern or reserved field is skipped, the sequence flowing around it; and the entire single column of the vertical timing pattern (column 6) is stepped over, keeping pairs aligned either side of it.
The most significant bit of the first codeword lands in the bottom-right corner cell.
Stage 4: mask, then metadata
The placed data region is XORed with the winning
mask pattern. Finally the 15-bit
format information (level + mask, BCH-protected, XORed
with 101010000010010) is written twice, and from version 7 the 18-bit
version information twice more. The symbol is complete.
To watch every stage with real numbers, follow the worked example in encode HELLO WORLD by hand — or generate any payload and decode it back to confirm the pipeline round-trips.
FAQ
What are the pad bytes 0xEC and 0x11 in a QR code?
Filler appended after the terminator to bring the data stream exactly to the version's capacity. They alternate — 11101100, 00010001 — and their balanced bit patterns avoid creating large uniform areas that would scan poorly.
How is data physically placed in a QR code?
In two-module-wide column pairs, starting at the bottom-right corner, filling upward then downward alternately across the symbol, skipping function patterns and stepping over the vertical timing column entirely.
What are remainder bits?
Zero bits appended after the final interleaved codeword because some versions have a few more data modules than a whole number of codewords fills — 7 bits for versions 2–6, 3 or 4 for several mid-range versions, none for the rest.
What order do the encoding stages run in?
Segments with mode and count headers, terminator, byte padding, pad bytes, block split, Reed–Solomon check codewords, interleaving, remainder bits, zig-zag placement, masking, and finally the format and version information fields.
Try it — free, no signup
Related
- Encode HELLO WORLD by hand — a complete worked example — The classic exercise: HELLO WORLD as a version 1-Q QR code, step by step, with every real intermediate value from character pairs to Reed–Solomon codewords.
- How a QR code is generated, step by step — Encoding runs in eight steps: choose the mode, choose the version, build the bit stream, split into codewords, compute Reed–Solomon error correction,…
- Error correction blocks and interleaving in QR codes — Why QR data is split into blocks and woven together codeword by codeword: so one physical scratch spreads across every block instead of destroying one.
- Mask patterns 0 to 7 — the eight formulas and why they exist — Every QR code XORs its data region with one of eight fixed patterns to break up problem shapes. The formulas, what they look like, and what masking prevents.