Es gibt verschiedene Zeichensätze, die man verwenden kann:
Man arbeitet im
"Numeric Mode" nur mit Ziffern (Bitkennung 0001)
"Alphanumeric Mode" mit Großbuchstaben, Ziffern und einigen Sonderzeichen (0010)
"Byte-Mode", bei dem (praktisch) alle Zeichen möglich sind. (0100)
Im Allgemeinen wird man wohl den Byte-Mode verwenden, weshalb ich hier die beiden anderen Arten "außen vor" lasse!
mehr zu den anderen Modi
Byte-Mode:
Nun werden die Daten, bestehend aus
rot ... Nur hier gibt es Unterschiede bei den 3 Modi:
4 Bit - Modus-Kennung,
unterschiedlich viele Bits (s.u.) für die Anzahl der zu übertragenen Zeichen im Text,
dem Text (den Ziffern; den alphanum. Zeichen),
4 Bits für den Terminator "0000",
Füllbits "0" bis zur nächsten 8-er-Bitzahl,
Füllzeichen (je 8 Bit) bis zur Kapazitätsgrenze (s.u.)
zusammengesetzt - und zwar alle Bits nacheinander in einer Reihe!
Dieses Paket wird dann von vorn in 8-er-Blöcke aufgeteilt -> Daten-Bytes. (DB)
Bei größeren QR-Codes wird das DB-Bytepaket dann in verschiedene Blöcke aufgeteilt.
Man unterteilt in 2 Gruppen mit jeweils meist unterschiedlichen Blockanzahlen.
In allen Blöcken der Gruppe 1 sind immer gleich viele Bytes; ebenso in allen Blöcken der Gruppe 2. Diese beiden Anzahlen können sich aber unterscheiden (wenn, dann sind die Blöcke in Gruppe 2 immer um 1 Byte größer als die Blöcke in Gruppe 1).
Danach wird zu jedem Block mit Hilfe des Reed-Solomon-Verfahrens ein Block mit Korrekturbytes gebildet, mit deren Hilfe dann beschädigte QR-Codes "gerettet" werden können.
Die Anzahl der Korrekturbytes pro Block ist abhängig von der Versionsnummer und dem Korrekturlevel. Sie ist in beiden Gruppen für jeden Block aber gleich groß!
Hier findet Ihr die Tabelle mit allen Vorgaben zu einer Version mit einem bestimmten Korrekturlevel: Vorgaben
Anhand von konkreten Beispielen möchte ich das nochmals vertieft durchspielen:
Beispiel 1: Text: Die Blume blüht
Es sind 15 Zeichen, also gerade noch Version 1 bei dem Korrekturgrad L (siehe Vorgabenseite) mit maximal 17 Zeichen.
Los geht's:
Vorgang | Bitfolge danach |
Es gibt im Text Großbuchstaben und Kleinbuchstaben ... wir verwenden den Byte-Modus mit der Bitkennung 0100 | 0100 |
Es sind 15 Zeichen zu kodieren; für Version 1 bis 9 müssen für die Zeichenanzahl 8 Bits, bei höheren Verionen 16 Bits verwendet werden. Version 1: 15 als Dualzahl mit 8 Bits ergibt 00001111 | 0100 00001111 |
Jetzt kommen die Nachrichtenbytes |
D | 68 | 01000100 | 0100 00001111 01000100 |
i | 105 | 01101001 | 0100 00001111 01000100 01101001 |
e | 101 | 01100101 | 0100 00001111 01000100 01101001 01100101 |
32 | 00100000 | 0100 00001111 01000100 01101001 01100101 ... | |
B | 66 | 01000010 | 0100 00001111 01000100 01101001 01100101 ... |
l | 108 | 01101100 | 0100 00001111 01000100 01101001 01100101 ... |
u | 117 | 01110101 | 0100 00001111 01000100 01101001 01100101 ... |
m | 109 | 01101101 | 0100 00001111 01000100 01101001 01100101 ... |
e | 101 | 01100101 | 0100 00001111 01000100 01101001 01100101 ... |
32 | 00100000 | 0100 00001111 01000100 01101001 01100101 ... | |
b | 98 | 01100010 | 0100 00001111 01000100 01101001 01100101 ... |
l | 108 | 01101100 | 0100 00001111 01000100 01101001 01100101 ... |
ü | 252 | 11111100 | 0100 00001111 01000100 01101001 01100101 ... |
h | 104 | 01101000 | 0100 00001111 01000100 01101001 01100101 ... |
t | 116 | 01110100 | 0100 00001111 01000100 01101001 01100101 00100000 01000010 01101100 01110101 01101101 01100101 00100000 01100010 01101100 11111100 01101000 01110100 |
Terminator "0000" wird angefügt | 0100 00001111 01000100 01101001 01100101 00100000 01000010 01101100 01110101 01101101 01100101 00100000 01100010 01101100 11111100 01101000 01110100 0000 |
da die Bitanzahl eine 8-er-Zahl ist kommen keine "0"-Füllbits hinzu | Bitfolge bleibt gleich |
Für Version 1 und Korrekturlevel L sind es 2 Zeichen zu wenig, also werden 2 Füllbytes angefügt Dezimal 236 , dann 17 , nach Bedarf immer weiter so im Wechsel | 0100 00001111 01000100 01101001 01100101 00100000 01000010 01101100 01110101 01101101 01100101 00100000 01100010 01101100 11111100 01101000 01110100 0000 11101100 00010001 |
Danach werden die Korrekturbytes (7 ECB pro Block - siehe Vorgaben) 122 129 27 175 62 242 145 als Bitfolge angefügt. Diese erhält man mittels des Reed-Solomon-Verfahrens aus den Nachrichtenbytes 64 244 70 150 82 4 38 199 86 214 82 6 38 207 198 135 64 236 17 (diese werden aus allen bisher ermittelten Bits gebildet) Kodierungsseite | 0100 00001111 01000100 01101001 01100101 00100000 01000010 01101100 01110101 01101101 01100101 00100000 01100010 01101100 11111100 01101000 01110100 0000 11101100 00010001 01111010 10000001 00011011 10101111 00111110 11110010 10010001 |
Nun die Bitfolge am Stück ... und dann aufgeteilt in Bytes (zu je 8 Bits) So werden die Bits nacheinander im QR-Code-Feld abgelegt. |
01000000111101000100011010010110010100100000010
00010011011000111010101101101011001010010000001
10001001101100111111000110100001110100000011101
10000010001011110101000000100011011101011110011
11101111001010010001 01000000 11110100 01000110 10010110 01010010 00000100 00100110 11000111 01010110 11010110 01010010 00000110 00100110 11001111 11000110 10000111 01000000 11101100 00010001 01111010 10000001 00011011 10101111 00111110 11110010 10010001 |
Das unmaskierte QR-Bild zum Vergleich: Die Kästchen-Randlinien würden normalerweise nicht gezeichnet! Man beginnt mit der Eintragung rechts unten und arbeitet sich auf der ersten Bahn (immer aus 2 Streifen bestehend) nach oben: Rechts unten, nach links, nach rechts/oben (diagonal), nach links, etc. ..., nach rechts/oben (diagonal), nach links (A) oben angekommen geht es auf der nächsten "Bahn" (wieder 2 Linien) nach unten: von (A) aus nach links, nach links, nach rechts/unten (diagonal), nach links, nach rechts/unten (diagonal), nach links, etc. ... und so immer weiter ... | |
Streifenweise: Beginn rechts unten.. 0100 0000 1111 0100 0100 0110 rot: nach oben 1001 0110 0101 0010 0000 0100 braun: nach unten 0010 0110 1100 0111 0101 0110 1101 0110 0101 0010 0000 0110 0010 0110 1100 1111 1100 0110 1000 - 0111 0100 0000 1110 1100 0001 - 0001 0111 1010 1000 0001 0001 1011 10101111 0011 1110 1111 0010 1001 0001 | |
Und jetzt nochmal ... maskiert mit Maske 0 für den QR-Code-Reader |
Das war´s!
Beispiel 2 Byte-Modus mit Version 7 und Korrekturlevel Q
Beispiel 3 Byte-Modus mit Version 19 und Korrekturlevel M ;