Wie QR-Codes funktionieren

Ich habe versucht, diesen Artikel so aufzubauen, dass er kein Vorwissen verlangt, aber auch keine wichtigen Details auslässt. Wir schauen uns dabei einen konkreten QR-Code an, der "https://qrboat.app/how-qr-codes-work" mit Fehlerkorrekturstufe H kodiert. Jede Abbildung und jede Zahl hier ist daraus berechnet. Alle Regeln und Konstanten sind gegen die Spezifikation ISO/IEC 18004 geprüft.

Das QRBoat-Maskottchen, ein kleines Boot beim Grübeln, mit zwei Fragezeichen darüber

Aufbau

Ein QR-Code ist ein Raster aus dunklen und hellen Quadraten, den Modulen. Das Raster als Ganzes heißt Symbol und jedes Modul darin steht nach einer Regel an seinem Platz.

Weniger als ein Viertel dieses Pixelhaufens sind deine Daten. Funktionsmuster und Formatinformation hängen allein von der Version ab und sind deshalb in jedem Symbol dieser Größe identisch. Der Rest ist der Datenbereich. Den teilen sich vier Dinge. Die Nachricht ist die Nutzlast mit ihren Moduskopfdaten und dem Abschlusszeichen des Bitstroms. Die Fehlerkorrektur sind Prüfcodewörter. Wie viele es sind, legt die Stufe fest, unabhängig von der Nachricht. Deshalb ist eine kurze Nachricht in einem großen Symbol vor allem Füllung: zwei Bytes im Wechsel, bis die Kapazität voll ist. Der Rest sind die wenigen Module hinter dem letzten Codewort, weil der Datenbereich nicht immer in ganze Codewörter zu acht Modulen aufgeht. Sie werden wie alle anderen gesetzt und maskiert und tragen nichts.

Kodiere mit
Fehlerkorrektur.
    • Nachricht 304 22%
    • Füllung 64 5%
    • Fehlerkorrektur 704 51%
    • Rest 7 1%

Symbole gibt es in 40 Größen, Version 1 bis 40. Die drei Suchmuster kosten in jeder davon gleich viel; also je größer das Symbol, desto kleiner ihr Anteil daran. Ausrichtungsmuster kommen ab Version 2 in einem sich weitenden Raster hinzu, Versionsinformation ab Version 7.

Die Mathematik

Ein Symbol der Version V ist 4V+17 Module breit, die 40 Versionen laufen also von 21 bis 177 Modulen je Seite oder von 441 bis 31.329 Modulen insgesamt. Aus der Breite ergibt sich die Version wieder. Darum wird sie erst ab Version 7 ausgeschrieben: Dort kostet es mehr, sich zu verzählen, als die 36 Module kosten.

Ab Version 2 sitzen die Mittelpunkte der Ausrichtungsmuster auf den Positionen ⌊V/7⌋+2 entlang jeder Achse. Jedes Positionspaar trägt ein Muster außer den dreien an den Ecken mit den Suchmustern, ein Symbol hat also (⌊V/7⌋+2)2−3 davon: 1 bei Version 5 und 46 bei Version 40.

VersionModuleFunktionsmoduleAnteil
144123353%
51.36929021%
4031.3291.6815%

Den Code finden

Ein Scanner sucht das Symbol, bevor er die Version, den Winkel oder die Modulgröße kennt. Er durchsucht das Bild nach einem einzigen Verhältnis. Eine Linie, die ein Suchmuster durch dessen Mitte kreuzt, läuft über fünf ununterbrochene Strecken (dunkel, hell, dunkel, hell, dunkel) im Verhältnis 1:1:3:1:1. Drehen oder Skalieren des Musters multipliziert alle fünf Strecken mit demselben Faktor, das Verhältnis bleibt also erhalten. Das gilt auch für eine Neigung: Aus der Entfernung liegt das ganze Symbol auf nahezu einer Tiefe, sodass das Suchmuster etwa gleichmäßig gestaucht wird und das Verhältnis intakt bleibt; aus der Nähe, wo die perspektivische Verzerrung und die Linsenverzerrung stärker sind, kann sich das Verhältnis über die Toleranz eines Scanners hinaus verschieben. Drei Treffer in den richtigen relativen Positionen legen drei Ecken des Symbols und seine Drehung fest.

Ein Scanner sucht nach dem Verhältnis, weshalb ein Suchmuster als abgerundetes Quadrat, als Kreis oder aus mehreren Teilen aufgebaut vorhanden sein kann: Eine Linie durch die Mitte läuft weiterhin über die fünf Strecken im selben Verhältnis. Die Spezifikation schreibt ein quadratisches Suchmuster vor; die anderen Formen funktionieren nur, weil Scanner sie tolerieren, und nur solange die Mittellinie intakt bleibt. Eine helle Lücke quer durch die Mitte teilt die mittlere Strecke in zwei: Aus fünf Strecken werden sieben und nichts passt mehr auf 1:1:3:1:1.

Drei Suchmuster geben einem Scanner nur eine Position, eine Drehung und einen Maßstab. Den Modulabstand liefern die Taktmuster: eine Linie aus abwechselnd dunklen und hellen Modulen zwischen den Suchmustern, die der Scanner zählt, statt Abstände gegen eine Modulgröße zu messen, die er raten müsste. Die Ausrichtungsmuster sind bekannte Punkte im Inneren des Symbols. Ein Scanner kann damit die Perspektive korrigieren, die ein Foto mit sich bringt. Außerhalb des Symbols liegt die Ruhezone, ein leerer Rand mit einer Breite von vier Modulen auf jeder Seite, damit irgendwelche Druckmotive neben dem Code nicht für Module gehalten werden. Vier Module sind eine harte Vorgabe der Spezifikation, Scanner kommen aber mit weniger aus.

11311::::

Zwei Abweichungen bleiben: Ein Symbol kann hell auf dunkel gedruckt und/oder gespiegelt sein. Die Spezifikation führt beide als optional und hat in ihrem Dekodierverfahren für jedes einen Schritt.

Hell auf dunkel gedruckt, tauscht jedes Modul seine Farbe und die Ruhezone wechselt mit: Der Rand ist der nach außen fortgesetzte Hintergrund des Symbols, er geht also mit den hellen Modulen. Wie herum es liegt, ermittelt ein Scanner an einem Suchmuster, dessen Färbung er bereits kennt. Die mittlere Dreierstrecke ist in einem gewöhnlichen Symbol dunkel, eine helle bedeutet also, dass das Bild invertiert und jedes Modul darin andersherum zu lesen ist.

Ein Code, der zum Beispiel von hinten durch Glas fotografiert wird, kommt gespiegelt an. Um welche Achse gespiegelt wurde, macht keinen Unterschied: Ein Quadrat hat vier Spiegelbilder und jedes ist eine Drehung der anderen. Ein Scanner, der Drehung ohnehin ignoriert, hat also genau einen Fall zu behandeln: das Symbol mit vertauschten Zeilen und Spalten.

Jedes Funktionsmuster ist symmetrisch zu dieser Diagonalen, ein transponiertes Symbol sieht also weiterhin wohlgeformt aus. Nur die Daten und die Formatinformation wandern. Die Formatinformation entscheidet es: Ein Scanner liest die 15 Bit und versucht sie zu korrigieren. Lässt sich keine der beiden Kopien auf ein Wort korrigieren, das der Code erzeugen kann, vertauscht er Zeilen und Spalten und liest erneut.

Scanner müssen keines von beiden unterstützen. Unser Tester nutzt rxing, das ein gespiegeltes Symbol ohne jeden Hinweis und ohne zusätzlichen Aufwand liest und ein invertiertes ablehnt, bis man ihm sagt, es mit invertiertem Bild zu versuchen. Spiegelung kostet diesen Dekoder nichts, hell auf dunkel kostet ihn einen Hinweis, den nicht jeder Scanner gibt.

Die Mathematik

Das Suchmuster besteht aus drei konzentrischen Quadraten um einen Mittelpunkt. Eine Linie durch diesen Mittelpunkt im Winkel θ trifft ein Quadrat der halben Breite s im Abstand s/max⁡(|cos⁡θ|,|sin⁡θ|). Der Faktor hängt allein von θ ab und nicht von s, jede Strecke entlang der Linie wird also um denselben Betrag gedehnt und das Verhältnis der fünf bleibt erhalten. Bei 45∘ ist er 2, etwa 1,41: Die Strecken messen 1,41, 1,41, 4,24, 1,41 und 1,41 Module.

Transponiert und gelesen, als läge es aufrecht, landen die beiden Formatkopien dieses Symbols 4 und 5 Bit vom nächstgelegenen Wort entfernt, das der (15, 5)-Code erzeugen kann. Er korrigiert drei, beide scheitern also.

Das durchgehende Beispielsymbol, dunkle Module auf hellem Papier.
Wie gezeichnet
Dasselbe Symbol hell auf dunkel, auch die Ruhezone ist dunkel.
Invertiert
Dasselbe Symbol mit vertauschten Zeilen und Spalten, das Suchmuster oben rechts sitzt jetzt unten links.
Gespiegelt
Dasselbe Symbol hell auf dunkel und mit vertauschten Zeilen und Spalten.
Beides

Kodierung

Der Inhalt wird zu Bits, bevor er platziert wird, und was ein Zeichen kostet, hängt davon ab, in welchem der vier Modi es geschrieben ist. Weniger Bits können ein kleineres Symbol bedeuten, ein Kodierer wählt also den günstigsten Modus, den der Inhalt zulässt.

  • Numerisch 0 bis 9 3 Zeichen in 10 Bit
  • Alphanumerisch 0 bis 9, A bis Z, Leerzeichen und $ % * + - . / : 2 Zeichen in 11 Bit
  • Byte jedes Byte, also jeden Text, sofern er als UTF-8 kodiert ist 1 Zeichen in 8 Bit
  • Kanji den Doppelbyte-Bereich von Shift JIS 1 Zeichen in 13 Bit

Jedes Segment beginnt mit vier Bit, die seinen Modus benennen: 0001 numerisch, 0010 alphanumerisch, 0100 byte, 1000 kanji. Ein Scanner liest sie als Erstes im Segment, denn sie legen die Breite des folgenden Zeichenanzahlfelds fest.

NumericAlphanumericByteKanji010020030015101517VersionCharacters
Ein Stufendiagramm. Die Zeichen laufen von links nach rechts bis 300 und die Version steigt nach oben. Eine Linie je Modus, jede steigt dort, wo eine Version voll wird. 300 Zeichen sind Version 8 im Modus numerisch, Version 10 im Modus alphanumerisch, Version 13 im Modus byte, Version 17 im Modus kanji.
Wo jeder Modus in die nächste Version übergeht, bei Stufe M. Von einer Zeichenanzahl nach oben lesen, zum kleinsten Symbol, das sie fasst.

Die Adresse dieser Seite, 36 Zeichen in Kleinschreibung, braucht Version 3. In Großbuchstaben passen dieselben 36 Zeichen in Version 2, weil Großbuchstaben im alphanumerischen Zeichensatz stehen und Kleinbuchstaben nicht. Schema und Host einer URL unterscheiden Groß- und Kleinschreibung nicht, sie großzuschreiben kostet also nichts. Ein Pfad unterscheidet sie: Ihn großzuschreiben zeigt auf etwas anderes.

Beide Symbole oben stehen auf Fehlerkorrekturstufe M und das durchgehende Beispiel steht auf Stufe H. Deshalb ergibt dieselbe Adresse anderswo auf der Seite ein größeres Symbol.

Die Adresse dieser Seite als QR-Code, Version 3.
Kleinschreibung, Byte-Modus, Version 3.
Dieselbe Adresse in Großbuchstaben als QR-Code, eine Version kleiner.
Großbuchstaben, alphanumerischer Modus, Version 2.

Die Bits bilden einen Strom. Im Byte-Modus beginnt er mit einem vier Bit langen Moduskennzeichner, dann folgt die Zeichenanzahl in acht Bit, dann ein Byte je Zeichen. Bis zu vier Nullbit schließen die Nachricht ab, weniger, wenn das Symbol fast voll ist. Danach wird der Strom auf eine ganze Zahl von Codewörtern aufgefüllt, der Acht-Bit-Einheit, in der jeder spätere Schritt arbeitet. Dieses Symbol fasst 46 Datencodewörter: Die Adresse und ihre Kopfdaten nehmen 38 und die verbleibenden 8 sind zwei feste Füllcodewörter im Wechsel. Eine kurze Nachricht endet deshalb mit einem sichtbar wiederkehrenden Muster.

Der voreingestellte Zeichensatz des Byte-Modus ist Latin-1, das westeuropäische Sprachen abdeckt und sonst nichts. Verlässt der Inhalt also ASCII, benennt der Kodierer UTF-8, statt einen Scanner die Voreinstellung annehmen zu lassen: ein ECI-Kopf, 12 Bit, die Zuweisung 26 benennen, vor dem ersten Segment. Zeichen kosten dann das, was UTF-8 für sie berechnet: Ein Buchstabe mit Umlaut kostet zwei Byte und ein Emoji vier, gegenüber einem für ein ASCII-Zeichen.

Die Mathematik

Zehn Bit fassen drei Ziffern, weil 999<210, also 313 Bit je Ziffer. Elf fassen zwei alphanumerische Zeichen, weil 452=2025<211, also je 512. Die 13 Bit des Kanji-Modus schlagen die 16, die dasselbe Zeichen als zwei Byte kostet.

Der Strom dieses Symbols ist 4+8+36×8=300 Bit lang, plus Endezeichen, was auf 38 Codewörter aufrundet.

Kapazität ist das, was die Datencodewörter fassen, nachdem die Kopfdaten bezahlt sind. Deshalb tragen die 46 Datencodewörter hier 44 Byte statt 46, von denen diese Adresse 36 nutzt. Version 40, die größte, fasst je Stufe:

StufeZiffernAlphanumerischByteKanji
L7.0894.2962.9531.817
M5.5963.3912.3311.435
Q3.9932.4201.6631.024
H3.0571.8521.273784
0100 Byte-Modus
00100100 36 Zeichen
01101000 "h"
01110100 "t"
01110100 "t"
01110000 "p"
… 32 weitere
0000 Endezeichen
11101100 00010001 8 Füllcodewörter
Der Strom in seiner Reihenfolge: der Moduskennzeichner, die Zeichenanzahl, ein Byte je Zeichen, das Endezeichen, dann die Füllcodewörter.
Der Strom dieses Symbols, Feld für Feld. 38 Codewörter tragen die Adresse und ihre Kopfdaten, 8 sind Füllung.

Ein Symbol muss nicht in einem Modus geschrieben sein. Der Strom ist eine Folge von Segmenten, jedes mit eigenem Moduskennzeichner und eigener Zeichenanzahl. Ein Scanner wechselt den Modus beim Lesen. Der günstigste Weg, gemischten Inhalt zu schreiben, ist also meist eine Mischung und die Ziffern in einem Link lassen sich günstiger als Text kodieren.

Jedes Segment kostet vier Bit Kennzeichner plus sein Feld für die Zeichenanzahl, eine kurze Folge bleibt also billiger, wo sie ist. Auch deshalb fallen die Grenzen nicht dorthin, wo das Auge sie setzen würde: Der Schrägstrich vor der Referenz kommt in den alphanumerischen Lauf, weil ein Schrägstrich in diesem Zeichensatz steht und es nichts kostet, ihn dorthin zu verschieben.

Der Kodierer hinter dieser Seite wählt einen Modus für die gesamte Zeichenkette. Die Aufteilung oben ist getrennt berechnet und gegen eine vollständige Suche geprüft.

Die Mathematik

Ein Segment aus n Zeichen kostet 4+c(M,V)+⌈rMn⌉ Bit: vier Bit Moduskennzeichner, dann das Feld für die Zeichenanzahl c(M,V), dann rM Bit je Zeichen. Aufgerundet wird an der Segmentgrenze, der einzigen Stelle, an der sich der Strom auf ein ganzes Bit ausrichtet, die laufenden Kosten werden also in Sechsteln eines Bit geführt und nur dort gerundet.

Eine gierige Aufteilung funktioniert nicht, denn ob ein Lauf sein eigenes Segment verdient, hängt von einem Kopf ab, dessen Breite von der Version abhängt. Die Aufteilung ist also ein dynamisches Programm über Positionen und Modi: fi(M) ist die geringste Bitzahl für die ersten n Zeichen mit Ende im Modus M. Es gilt fi(M)=min⁡(fi−1(M)+rM, minM′⁡⌈fi(M′)⌉+4+c(M,V)).

Breiten des Zeichenanzahlfelds, ISO/IEC 18004 Tabelle 3. Die Breite koppelt die beiden Suchen: Sie hängt von der Version ab, die Version von der Gesamtzahl, die Gesamtzahl von der Aufteilung. Innerhalb eines Bandes kann sich die Aufteilung nicht ändern, sie wird also einmal je Band berechnet und die Versionssuche läuft darin.

Modus1 bis 910 bis 2627 bis 40
Numerisch101214
Alphanumerisch91113
Byte81616
Kanji81012
https://qrboat.app/r Byte 20 Zeichen, 172 Bit
/QRB-2026- Alphanumerisch 10 Zeichen, 68 Bit
8613612345678901 Numerisch 16 Zeichen, 68 Bit
Der Link, aufgeteilt in 3 Läufe, jeder in der Farbe des Modus, in dem er geschrieben wurde: Host und Pfad im Byte-Modus, die Referenz in Großbuchstaben alphanumerisch, die Ziffern numerisch.
308 Bit in 3 Segmenten, gegenüber 380 als ein einzelnes Byte-Segment. Version 3 statt Version 4.
https://qrboat.app/r/42 Byte 23 Zeichen, 196 Bit
Dieselbe Form von Link mit nur zwei Ziffern am Ende, als ein einzelner Lauf im Byte-Modus belassen.
Ein eigenes Segment für zwei Ziffern spart nichts: 196 Bit so oder so, also lässt der Kodierer den Link als ein Segment.

Fehlerkorrektur

Ein beschädigtes Symbol lässt sich noch lesen, weil der größte Teil davon nicht die Nachricht ist. Das Symbol, das diese Seite durcharbeitet, Version 5 bei Fehlerkorrekturstufe H, enthält 134 Codewörter: 46 sind Daten, die Nachricht mit ihrer Füllung, die anderen 88 sind daraus berechnete Reed-Solomon-Parität. Ein Scanner rekonstruiert die Codewörter, die er nicht lesen konnte, aus den übrigen.

Eine Prüfsumme sagt nur, dass etwas falsch ist. Die Parität sagt, welcher Teil. Der Kodierer behandelt die Datencodewörter als Koeffizienten eines Polynoms und wählt die Parität so, dass Daten und Parität zusammen genau durch ein festes Generatorpolynom teilbar sind. Ein Scanner teilt, was er empfangen hat: kein Rest heißt, der Block ist unversehrt. Gibt es einen, liefert seine Auflösung, welche Codewörter falsch sind und welche Werte sie hätten haben sollen.

Ein falsches Codewort zu orten und zu korrigieren kostet zwei Paritätscodewörter, eines zum Finden und eines zum Berichtigen. Ein Scanner, der bereits weiß, welches Codewort er nicht lesen konnte, braucht nur eines.

Derselbe Algorithmus läuft auf jedem Block einzeln. Die 134 Codewörter unseres Beispiels werden in 4 Blöcke geteilt, je 11 oder 12 Datencodewörter und 22 Paritätscodewörter. Jeder Block wird für sich korrigiert, bis zu 11 falsche Codewörter darin, gleich was die anderen Blöcke enthalten. Hat ein Block mehr als 11, dekodiert das Symbol nicht.

Die Blöcke sind ungleich, weil die Datencodewörter nicht durch 4 teilbar sind. Die Spezifikation stellt die kurzen nach vorne.

Wie viel Parität ein Symbol trägt, wird vor jeder Kodierung entschieden. Es gibt vier Stufen und eine höhere tauscht Kapazität gegen Toleranz, in einem Symbol von exakt derselben Größe.

Die 7, 15, 25 und 30 Prozent, die für die vier Stufen üblicherweise genannt werden, sind Nennwerte. Die Anteile in der Tabelle sind an dieser Version gemessen und beziehen sich auf die 134 Codewörter, nicht auf die bedruckte Fläche.

Die Mathematik

Ein Codewort ist ein Element des Körpers GF(28): ein Byte, mit XOR als Addition und Multiplikation modulo x8+x4+x3+x2+1. Ein Block aus k Datencodewörtern ist die Koeffizientenliste eines Polynoms m(x) und das Generatorpolynom für 2t Paritätscodewörter ist g(x)=(x−α0)(x−α1)⋯(x−α2t−1), mit α=2. Die Parität ist der Rest von m(x)⋅x2t geteilt durch g(x), der vollständige Block ist also durch g teilbar.

Ein Dekoder wertet den empfangenen Block an α0 bis α2t−1 aus. Lauter Nullen heißt: keine Fehler. Sonst orten und korrigieren 2t Paritätscodewörter t Fehler an unbekannten Stellen oder füllen 2t Auslöschungen an bekannten. Hier ist k gleich 11 oder 12 und 2t gleich 22, also ist t gleich 11.

Block 1 dieses Symbols, von den Modulen abgelesen. Das erste Datencodewort, 0x42, ist der Moduskennzeichner und die obere Hälfte der Zeichenanzahl.

Daten42 46 87 47 47 07 33 a2 f2 f7 17
Parität0a 44 f1 e0 8a 95 8b 36 4e 60 cf e2 1c 26 2d 6a 28 dc 36 1d 4f 14
Die vier Fehlerkorrekturstufen, an dieser Version gemessen.
StufeDatenDaten und ParitätKorrigiertAnteilBlöcke
Lniedrig108 108 Daten, 26 Parität1310%1
Mmittel86 86 Daten, 48 Parität2418%2
Qerhöht62 62 Daten, 72 Parität3627%4
Hhochdieses Symbol46 46 Daten, 88 Parität4433%4

Korrigiert summiert, was jeder Block für sich korrigiert. Das ist eine Obergrenze: Ein Symbol erreicht diese Summe nur, wenn die Beschädigung gleichmäßig über die Blöcke verteilt ist.

Die acht Module eines Codeworts bleiben zusammen in einem zwei Module breiten Stapel entlang der Platzierungsreihenfolge. Die Codewörter davor und danach im Strom gehören zu den anderen Blöcken.

Die Stapel haben nicht alle dieselbe Form, und die Form geht auf die Platzierungsreihenfolge zurück, nicht auf den Block.

Ein Ausschnitt des Symbols, in dem jedes Codewort seine eigene Umrisslinie hat, eines davon in der Akzentfarbe umringt. Jeder Umriss umschließt acht Module in einer kompakten, zwei Module breiten Gruppe statt in einer Zeile oder verstreut, einige davon an beiden Enden um ein Modul versetzt. Die Codewörter über und unter dem umringten liegen in anderen Blöcken und tragen andere Farben.
Jedes Codewort in seinem eigenen Umriss, eines davon umringt: acht Module zusammen, mit seinen Nachbarn im Strom in den anderen 3 Blöcken.

Die Blöcke werden verschachtelt: Der Strom nimmt das erste Codewort von Block 1, dann das erste von Block 2 und so weiter, bis alle 4 Blöcke über das ganze Symbol verteilt sind. Beschädigung an einer Stelle verteilt sich dann auf die Blöcke und jeder verliert nur wenige Codewörter.

Die Parität wird je berührtem Codewort ausgegeben, nicht je Modul. Ein Fleck überdeckt ganze Codewörter, eine Streuung derselben Fläche berührt mit jedem Modul ein anderes Codewort. An diesem Symbol gemessen dekodiert der Code unter dem Fleck, mit dem die Demo öffnet, noch immer, gleich wo dieser Fleck liegt, und er überdeckt bis zu 184 Datenmodule. Gleichmäßig verteilt genügen 32 Module, um einen Block zu verlieren.

Ein Logo liegt auf einem Symbol wie dieser Fleck: Es überdeckt ganze Codewörter an einer Stelle und dieselbe Parität muss sie reparieren.

Beide Zahlen zählen nur Datenmodule. Ein Fleck über einem Suchmuster ist ein anderer Fehler: Die Parität deckt nichts außerhalb des Datenbereichs ab.

Die Mathematik

Verschachtelung: Bei B Blöcken enthält Position p des Stroms das Codewort ⌊p/B⌋ von Block pmodB, bis die kurzen Blöcke aufgebraucht sind; die Paritätscodewörter werden nach den Daten auf dieselbe Weise verschachtelt.

Jedes Datenmodul eingefärbt nach dem Block, zu dem es gehört.

Ziehe den Fleck oder bewege ihn mit den Pfeiltasten.

Getroffene Codewörter je Block.
BlockGetroffene Codewörter
1 7 / 11
2 8 / 11
3 8 / 11
4 8 / 11

Jeder Block bleibt in seiner Grenze. Das Symbol dekodiert weiterhin.

Platzierung

Der verschachtelte Strom geht in einer festen Reihenfolge ins Raster: zwei Spalten auf einmal, beginnend in der unteren rechten Ecke, aufwärts durch das eine Spaltenpaar und abwärts durch das nächste, unter Auslassung der Funktionsmuster.

Diese Reihenfolge ist eine Eigenschaft der Version und nicht der Nachricht. Deshalb kann ein Scanner sie ablaufen, bevor er die Maske, die Stufe oder den Inhalt kennt.

Die 8 Füllcodewörter stehen am Ende der Nachricht, aber nicht am Ende des Laufs: Die Verschachtelung verteilt dieses Ende über das ganze Symbol.

Alle 134 Codewörter platziert. Die letzten 7 Module des Laufs gehören zu keinem Codewort.

Ein Schritt des Laufs nimmt das rechte Modul einer Zeile und dann das linke daneben, der Schritt danach geht eine Zeile weiter. Ein Paar wird ganz erstiegen oder ganz abgestiegen, und die Kehre kommt dort, wo oben oder unten die Daten ausgehen.

8 so genommene Module füllen vier Zeilen eines Paares, und daher kommen die Formen der Codewörter. Das hier hervorgehobene ist an beiden Enden versetzt: Es beginnt auf einem linken Modul, setzt also eine halbe Zeile versetzt ein, und über ihm gehen die Daten aus, sein letztes Modul ist deshalb das erste Modul des nächsten Paares.

Ein Paar überspringt das senkrechte Taktmuster als Ganzes, die Laufrichtung kehrt sich dort also nicht um, wo das Muster sitzt.

Die Mathematik

Man nummeriere eine Spalte c vom rechten Rand aus und lasse das senkrechte Taktmuster aus der Zählung heraus. Ihr Paar ist ⌊c/2⌋, und dieses Paar wird erstiegen, wenn ⌊c/2⌋mod2=0 gilt, sonst abgestiegen.

Neun mal neun Module des durchgerechneten Symbols mit der darüber gezeichneten Platzierungsreihenfolge: Die Linie nimmt in jeder Zeile das rechte Modul vor dem linken, ersteigt ein Spaltenpaar, überspringt das senkrechte Taktmuster als Ganzes und steigt das nächste Paar ab. Ein Codewort über der Kehre ist hervorgehoben.
Derselbe Lauf, neun Module breit. Das hervorgehobene Codewort läuft vom Ring zum Pfeil: eine halbe Zeile, drei ganze Zeilen, dann ein Modul im nächsten Paar.

Der Datenbereich umfasst 1.079 Module und die 134 Codewörter nehmen je 8 davon, zusammen 1.072. Am Ende der Reihenfolge bleiben also 7 Module übrig, zu wenige für ein weiteres Codewort. Die Spezifikation nennt sie Restbits: Sie werden wie jedes andere Modul platziert und maskiert. Ein Scanner verwirft sie.

Maskierung

Direkt ins Raster gelegt, können die Daten auf drei Arten ungünstig liegen: als große Fläche einer Farbe, als lange Strecke entlang einer Zeile oder Spalte, als Folge im Verhältnis 1:1:3:1:1, die ein Scanner für ein Suchmuster halten würde. Also legt der Kodierer eine Maske an, nachdem er die Daten platziert hat: ein festes geometrisches Muster, das benennt, welche Datenmodule invertiert werden.

Eine Maske anzulegen ist ein Exklusiv-Oder: Wo das Muster an ist, kommt das Modul in der anderen Farbe heraus, wo es aus ist, bleibt das Modul, wie es platziert wurde. Keine Maske rührt die Funktionsmodule an: die Such- und Ausrichtungsmuster, die Taktmuster, die Trennzonen um die Suchmuster und die Formatinformation daneben. Genau diese Ausnahme lässt einen Scanner ihnen trauen, bevor er weiß, welche Maske verwendet wurde. Es gibt acht Muster. Der Kodierer bewertet jedes nach vier Regeln und die niedrigste Summe gewinnt.

Strecken
Fünf oder mehr Module einer Farbe entlang einer Zeile oder Spalte. 3 Punkte und einer mehr für jedes Modul über dem fünften.
Blöcke
Jedes Zwei-mal-zwei-Quadrat einer Farbe. je 3 Punkte.
Suchmusterähnlich
Jede 1:1:3:1:1-Folge mit vier hellen Modulen daneben, die wie ein Suchmuster aussieht. je 40 Punkte.
Ausgewogenheit
Wie weit der Anteil dunkler Module von der Hälfte entfernt liegt. 10 Punkte je 5-%-Schritt außerhalb von 45 bis 55.

Die acht Summen laufen hier von 1634 für Maske 4 bis 1830 für Maske 6. Die Daten ganz ohne Maske kämen auf 1755, niedriger als 6 der acht. Der Kodierer kann vorher nicht wissen, welcher Inhalt sich schlecht platziert, also bewertet er jedes Mal alle acht. Würde sich ein Inhalt sonst als große leere Fläche platzieren, bricht die Maske sie auf.

Bewertet wird das ganze Symbol, ein echtes Suchmuster wird also dafür belastet, dass es wie eines aussieht: 18 der 21 suchmusterähnlichen Folgen der Siegermaske sind die drei Suchmuster selbst und 3 fallen in die Daten. Die Ausgewogenheitsregel ergibt für jeden Kandidaten null, die Entscheidung liegt also bei den ersten dreien.Sie kostet zwischen 45 % und 55 % Dunkelanteil nichts: Die platzierten Daten liegen bereits bei 49.6 % und die acht Kandidaten landen zwischen 49.5 % und 53.2 %.

Die Mathematik

Strecken und suchmusterähnliche Folgen werden auf Zeilen und Spalten unabhängig bewertet, eine Form, die auf beiden Achsen liegt, wird also doppelt belastet. Ein Zwei-mal-zwei-Block wird je linker oberer Ecke einmal gezählt, eine geschlossene Fläche von n mal n Modulen kostet also (n - 1)² davon.

Die Maske:
  • invertiert
  • unverändert
  • ausgenommen
Maske 4. Summe 1634, die niedrigste der acht, das ist also die Maske, die der Kodierer anlegt.
Die platzierten Daten und die acht Maskenkandidaten, nach den vier Regeln bewertet. Jeder Balken läuft von null bis zum höchsten Wert seiner eigenen Spalte. Wähle eine Zeile, um sie oben zu zeigen.
MaskeInvertiert ein Modul, woStreckenBlöckeSuchmusterähnlichAusgewogenheitGesamtwertung
406 429 920 0 1755
(i+j)mod2=0442 495 840 0 1777
imod2=0451 471 840 0 1762
jmod3=0434 429 920 0 1783
(i+j)mod3=0416 468 880 0 1764
(⌊i/2⌋+⌊j/3⌋)mod2=0365 429 840 0 1634
(i⋅j)mod2+(i⋅j)mod3=0404 453 960 0 1817
((i⋅j)mod2+(i⋅j)mod3)mod2=0437 513 880 0 1830
((i+j)mod2+(i⋅j)mod3)mod2=0421 438 840 0 1699

Ein Scanner muss wissen, welche Maske er rückgängig machen soll, bevor er überhaupt etwas lesen kann, die Maskennummer steht also unmaskiert im Symbol. Die Formatinformation sind 15 Bit neben den Suchmustern, zweimal geschrieben: zwei Bit Fehlerkorrekturstufe (10 für Stufe H), drei Bit Maskennummer (100 für Maske 4) und zehn Prüfbit, aus diesen fünf berechnet. Alle 15 werden dann mit einem festen Wort verknüpft, damit keine Kombination aus Stufe und Maske als lauter Nullen herauskommt. Der Code korrigiert in jeder Kopie bis zu drei falsche Bit.

Die Mathematik

Die Prüfbits sind der Rest der fünf Datenbit, um zehn nach links geschoben, geteilt durch das Generatorpolynom x10+x8+x5+x4+x2+x+1. Das ist ein (15, 5)-BCH-Code: 32 gültige Wörter, von denen sich je zwei in mindestens sieben Bit unterscheiden, drei Fehler sind also korrigierbar. Die Stufenbits laufen nicht in der Reihenfolge der Stufen: L ist 01 und M ist 00.

Das Formatwort dieses Symbols: die Daten- und Prüfbits, verknüpft mit dem festen Wort, ergeben die 15 Bit, die ins Symbol geschrieben werden.
Daten- und Prüfbits10 100 1101110000
Festes Wort10 101 0000010010
Geschrieben00 001 1101100010

Gruppen: Stufe (2), Maske (3), Prüfbits (10).

Zurücklesen

Ein Scanner läuft die Schritte von oben rückwärts ab. Wähle einen Schritt, um zu sehen, was ein Scanner an dieser Stelle hat.

  1. Drei 1:1:3:1:1-Folgen in den richtigen relativen Positionen ergeben die Ecken und die Drehung (den Code finden).

  2. Die Taktmuster geben den Modulabstand und die Ausrichtungsmuster korrigieren die Perspektive. Dann wird ein Bit je Modul abgetastet.

  3. Bis zu drei Bit darin korrigieren und die Fehlerkorrekturstufe und die Maskennummer entnehmen (Maskierung).

  4. Jedes Datenmodul invertieren, das die Maske auswählt.

  5. Die Bits entlang der Platzierungsreihenfolge zu Codewörtern lesen und sie zurück in ihre Blöcke sortieren (Fehlerkorrektur).

  6. Jeder Block wird für sich korrigiert, gegen seine eigene Parität.

  7. Segment für Segment, jedes mit eigenem Modus und eigener Anzahl, bis zum Endezeichen oder zum Ende der Daten (Kodierung).

Diese sieben Schritte erklären jedes Modul: 21 % Funktionsmuster und Formatinformation, 22 % Adresse, 5 % Füllung, 51 % Fehlerkorrektur. Die 7 Module, die am Ende der Platzierungsreihenfolge übrig bleiben, verwirft ein Scanner.

Drei Suchmuster, 147 Module. Welche Ecke keines hat, ergibt die Drehung.

Ursprünge

Der Code wurde bei Denso von einem Team unter Leitung von Masahiro Hara entwickelt und 1994 vorgestellt. Das Problem war die Teileverfolgung. Ein Strichcode fasst etwa 20 Zeichen, eine Kiste mit Teilen trug also mehrere davon und ein Arbeiter am Band scannte rund 1000 Mal am Tag.

Das Raster kam von einem Brettspiel. Hara hat erzählt, dass er in den Mittagspausen im Büro Go spielte und dass ihm das Anordnen schwarzer und weißer Steine auf einem Raster als einfacher Weg erschien, Information zu halten. Dasselbe sagte er 2025 erneut, als der japanische Go-Verband ihn zum Go-Botschafter machte.

Das Verhältnis 1:1:3:1:1 fand das Team durch Auszählen von Druckerzeugnissen (Flyern, Zeitschriften, Karton): Gesucht war das Verhältnis von Dunkel zu Hell, das am seltensten vorkommt, damit eine Suche nach dem Muster nur selten auf den Druck rund um das Symbol passt.

AIM normte den Code 1997 und JIS 1999. ISO folgte 2000, als ISO/IEC 18004, die Spezifikation, die diese Seite zitiert.

DENSO WAVE hält Patente auf den QR Code und hat erklärt, sie gegen Codes, die der JIS- oder ISO-Norm folgen, nicht geltend zu machen. Haras Begründung war, dass ein einzelnes Unternehmen die Infrastruktur nicht schnell genug allein aufbauen könne. Einen normgerechten QR-Code zu erzeugen, braucht also keine Lizenz von DENSO WAVE.

"QR Code" ist eine eingetragene Marke der DENSO WAVE INCORPORATED in Japan und weiteren Ländern. QRBoat steht in keiner Verbindung zu ihnen und wird von ihnen weder unterstützt noch empfohlen.

Quellen