- Verfolgt den internen Prozess, bei dem Text in einen QR-Code umgewandelt wird, anhand einer Visualisierung der Schritte 0 bis 9 und zeigt, wie die Nayuki QR Code generator library funktioniert
- Die Beispieleingabe
Hello, world! 123wird als 17 Unicode-Codepoints analysiert und im Byte-Modus codiert, da sie weder Numeric, Alphanumeric noch Kanji ist - Durch Aneinanderhängen von Modusbits, Zeichenanzahl, Segmentdaten und Terminator-Bits entstehen 19 Daten-Codewords, die in die Kapazität von Version 1 mit ECC L passen
- Ein QR-Code der Version 1 hängt in einem Block an 19 Daten-Codewords 7 Reed–Solomon-ECC-Codewords an und platziert anschließend feste Muster und Datenmodule
- Durch Vergleich der Penalties der 8 Masken wird das Mask pattern 3 mit der niedrigsten Gesamtpunktzahl ausgewählt; das Endergebnis entsteht also nicht nur durch einfache Codierung, sondern auch durch Qualitätsbewertung
Ziel der Demo und Verarbeitung der Eingabe
- Diese Webanwendung visualisiert Schritt für Schritt, wie eine Textzeichenfolge als QR-Code codiert wird
- Die Seite zeigt den Codierungsprozess detailliert, um die interne Funktionsweise der QR Code generator library nachvollziehbar zu machen
- Die Benutzereingaben bestehen aus Textzeichenfolge, Fehlerkorrekturstufe, erzwungener Mindest-Version und erzwungenem Maskenmuster
Schritt 0: Analyse der Unicode-Zeichen
- Die Beispielzeichenfolge lautet
Hello, world! 123; die Anzahl der Codepoints im Eingabetext beträgt 17 - Für jedes Zeichen wird geprüft, ob es in den Modi Numeric, Alphanumeric, Byte oder Kanji codiert werden kann
- Die Codierbarkeit der gesamten Zeichenfolge nach Modus ist wie folgt
- Numeric: nicht möglich
- Alphanumeric: nicht möglich
- Byte: möglich
- Kanji: nicht möglich
- Der gewählte Segmentmodus, um alle Zeichen aufzunehmen, ist Byte
Schritt 1: Datensegment erzeugen
- Jedes Zeichen wird in eine Bitfolge umgewandelt
- In den Modi Numeric und Alphanumeric werden aufeinanderfolgende Zeichen gruppiert und codiert
- Im Byte-Modus erzeugt ein Zeichen 8, 16, 24 oder 32 Bit
- Im Beispiel wird der Hexadezimalwert jedes Zeichens in 8 Bit umgewandelt
H:48→01001000e:65→011001011:31→001100012:32→001100103:33→00110011
- Das Demoprogramm erzeugt zur Vereinfachung immer ein einzelnes Segment
- Eine optimale Aufteilung zur Reduzierung der gesamten Bitlänge wird separat unter optimal text segmentation for QR codes behandelt
Schritt 2: Versionsnummer anpassen
- Die gesamte Bitlänge, die zur Darstellung der Segmentliste benötigt wird, hängt vom Versionsbereich ab
- Version 1–9: 148 Bit, 19 Codewords
- Version 10–26: 156 Bit, 20 Codewords
- Version 27–40: 156 Bit, 20 Codewords
- Ein Codeword ist als 8 Bit, also 1 Byte, definiert
- Die Kapazität eines QR-Codes für Daten-Codewords hängt von Version und Fehlerkorrekturstufe ab
- Die Beispieleingabe passt bei der gewählten Fehlerkorrekturstufe in Version 1
- Die endgültig gewählte Versionsnummer ist 1
Schritt 3: Segmente verbinden, Padding, Codewords erzeugen
- Mehrere Bitstrings werden aneinandergehängt, um den Daten-Bitstrom zu bilden
- Segment 0 mode:
0100, 4 Bit - Segment 0 count:
00010001, 8 Bit - Segment 0 data: 136 Bit
- Terminator:
0000, 4 Bit
- Segment 0 mode:
- Die kumulierte Bitanzahl beträgt 152 Bit
- In diesem Beispiel haben sowohl Bit-Padding als auch Byte-Padding 0 Bit
- Die gesamten Daten-Codeword-Bytes werden in 8-Bit-Einheiten aufgeteilt und hexadezimal dargestellt
41 14 86 56 C6 C6 F2 C2 07 76 F7 26 C6 42 12 03 13 23 30
Schritt 4: Blockaufteilung, ECC hinzufügen, Interleaving
- Die Blockstatistik des Beispiels ist wie folgt
- Anzahl der Daten-Codewords: 19
- Anzahl der Blöcke: 1
- Daten-Codewords pro kurzem Block: 19
- Daten-Codewords pro langem Block: nicht zutreffend
- ECC-Codewords pro Block: 7
- Anzahl kurzer Blöcke: 1
- Anzahl langer Blöcke: 0
- Die Daten-Codeword-Sequenz wird in kurze und lange Blöcke aufgeteilt; am Ende jedes Blocks werden ECC-Codewords berechnet und angehängt
- Der mathematische Ablauf der Berechnung der Reed–Solomon-Fehlerkorrekturcodes wird ausgelassen, weil er lang, mühsam und wenig interessant ist
- Die endgültige Codeword-Sequenz besteht aus ineinander verschachtelten Daten- und ECC-Codewords
41 14 86 56 C6 C6 F2 C2 07 76 F7 26 C6 42 12 03 13 23 30 85 A9 5E 07 0A 36 C9
- Auch der endgültige Bitstrom, der im Zickzack-Scan gezeichnet wird, wird aus dieser Codeword-Sequenz erzeugt
Schritte 5–6: Feste Muster und Codeword-Platzierung
- Im Schritt für feste Muster wird in Zeile 6 und Spalte 6 das timing pattern gezeichnet
- In den drei Ecken wird jeweils ein 8×8 finder pattern einschließlich Separator platziert
- Um die Finder herum werden vorläufige dummy format bits eingefügt
- Im Schritt der Codeword-Platzierung wird ein Zickzack-Scan berechnet, der in der rechten unteren Ecke beginnt
- Der Zickzack-Scan überspringt Funktionsmodule (function modules) und besucht Module, die noch nicht gefüllt sind
- Daten-, ECC- und Remainder-Module werden entsprechend den endgültigen Codeword-Bitwerten und der Zickzack-Reihenfolge gezeichnet
- Als Beispiel ist das hexadezimale Codeword
C5binär11000101und erzeugt die Modulsequenz[dark, dark, light, light, light, dark, light, dark]
Schritte 7–9: Maske anwenden und Penalty berechnen
- Jedes Maskenmuster wirkt sich nur auf Nicht-Funktionsmodule (non-function modules) aus
- Die Maske wird per XOR auf Daten-, ECC- und Remainder-Module angewendet
- Die tatsächlichen format bits werden rund um die Finder gezeichnet
- Die Penalty-Suche prüft folgende Elemente
- horizontale Runs von 5 oder mehr Modulen derselben Farbe
- vertikale Runs von 5 oder mehr Modulen derselben Farbe
- 2×2-Boxen derselben Farbe
- horizontale finder-like pattern
- vertikale finder-like pattern
- Gleichgewicht zwischen dunklen und hellen Modulen
- Größe und Farbverhältnis des Beispiel-QR-Codes sind wie folgt
- Seitenlänge: 21
- Gesamtzahl der Module: 441
- Helle Module: 221
- Dunkle Module: 220
- Anteil dunkler Module: 49,887 %
- Abweichung von der Hälfte: −0,113 %
- Die gesamten Penalties der 8 Masken sind wie folgt
- Mask 0: 1204
- Mask 1: 1134
- Mask 2: 1084
- Mask 3: 1081
- Mask 4: 1121
- Mask 5: 1100
- Mask 6: 1189
- Mask 7: 1137
- Die Maske mit der niedrigsten Gesamt-Penalty ist Mask pattern 3
Quellcode
- Der TypeScript-Quellcode der Webanwendung wird als file 0 und file 1 bereitgestellt
- Der kompilierte JavaScript-Code ist unter creating-qr-code-steps.js zu finden
1 Kommentare
Hacker-News-Kommentare
Auch hier sagt der Autor, sie sei „lang, langweilig und nicht besonders interessant“, aber weil alle so denken, ist sie inzwischen ziemlich schwer zu finden
Reed-Solomon kam etwas nach der Mitte des Semesters dran, und der Kern ist, dass es auf Polynomen basiert. Wenn man genügend Punkte hat, ist das Polynom eindeutig bestimmt; fügt man also zusätzliche Punkte hinzu, kann man es rekonstruieren, selbst wenn einige verloren gehen
Der Rest ist die Frage, wie man das auf Binärdaten anwendet, also der Teil mit endlichen Körpern. Mathematisch schön, aber ziemlich komplex
https://www.thonky.com/qr-code-tutorial/error-correction-cod...
https://dev.to/maxart2501/let-s-develop-a-qr-code-generator-...
https://www.youtube.com/watch?v=w5ebcowAJD8
In den Kommentaren ist ein stark elitärer Ton zu spüren. Beim flüchtigen Durchsehen des Blogs bittet er um Bitcoin-Spenden und schlägt 3 $ vor, scheint aber nicht zu berücksichtigen, dass ein erheblicher Teil davon durch Gebühren verschwinden kann
Es klingt etwa wie: „Nein, du darfst den Code aus meinem GitHub-Repository nicht für deinen Uni-Projekt-Chatbot verwenden. Deine Coding-Standards genügen meinen nicht. Und dein Englisch ist auch miserabel“
Zum Glück teilt er auch gutes Feedback separat: https://www.nayuki.io/page/decent-feedback-from-readers
Ich will nichts in der Art, wie man es bei Google findet: „Einfach diese Computer-Vision-Bibliothek einbinden, ein Bild hineinwerfen, und das Ergebnis kommt heraus“
Ich suche einen Guide, der davon ausgeht, dass bereits dekodierte Rohbilddaten vorliegen, und dann alle nötigen Algorithmen implementiert
Auf GitHub habe ich auch ein paar gefunden, aber die hatten andere Probleme, also habe ich mit einer gut designten Bibliothek, die ich schon einmal genutzt hatte, schnell selbst etwas gebaut; es dauerte etwa 15 Minuten
https://greggman.github.io/qr-code/
Man könnte noch mehr Optionen hinzufügen, aber ich glaube, die meisten Nutzer brauchen solche Optionen eigentlich nicht
Falls jemand hilfreiche Ressourcen kennt, aus denen man den Fehlerkorrekturteil bei QR-Codes lernen kann, wüsste ich gern davon
https://github.com/aabiji/qr
https://github.com/PDP-10/its/blob/master/src/lars/qrcode.8