- QR कोड को हाथ से decode करने के लिए version 1 के 21×21 modules की संरचना से लेकर mask हटाने और byte conversion तक की step-by-step प्रक्रिया व्यवस्थित की गई है
- finder pattern, timing pattern, format information, quiet zone जैसे special areas पहचान के लिए ज़रूरी हैं, लेकिन वास्तविक data पढ़ते समय इन्हें skip करना होता है
- data को format information से mask pattern और error correction level की पुष्टि करने के बाद, mask में काले module वाली हर position पर QR code modules को flip करके restore किया जाता है
- नीचे दाईं ओर से शुरू करके दो columns के हिसाब से zigzag order में पढ़ा जाता है, और Byte mode में 8-bit length के बाद आने वाले 8-bit groups character bytes बनते हैं
- error correction area को हाथ से हल करने की ज़रूरत नहीं है; simple QR codes में length field जितने bytes बताए, उतने पढ़कर ASCII table से बदल दें तो decode किया जा सकता है
हाथ से पढ़ने के लिए QR कोड तैयार करना
- practice के लिए QR code तीन तरीकों से तैयार किया जा सकता है
- कोई भी text डालकर नीचे समझाए गए QR code को update करें
- camera से मौजूदा QR code scan करके उसे पढ़ना सीखें
- random English words से practice करें; शब्द दिखाए नहीं जाते, इसलिए training के लिए इस्तेमाल किया जा सकता है
- example QR code का size 21×21 modules है
- QR code में pixel के बराबर unit को module कहा जाता है
- QR code size को version से अलग किया जाता है
- सबसे छोटा version 21×21 modules का होता है
- इसके बाद हर version में एक side का size 4 से बढ़ता है
- 21×21 modules वाला QR code version 1 है
QR code में skip किए जाने वाले special areas
- finder pattern scanner को पहले QR code identify करने में मदद करता है
- finder pattern के आसपास की खाली lines content पढ़ते समय skip करनी चाहिए
- version 1 QR code में alignment pattern नहीं होता
- alignment pattern एक additional pattern है, जो scanner को QR code सही तरीके से पढ़ने में मदद करता है
- timing pattern दो lines होती हैं जिनमें black और white modules हमेशा बारी-बारी से आते हैं; ये scanner को QR code सही तरीके से पढ़ने में मदद करती हैं
- format information mask pattern और error correction level तय करती है
- vertical format information और horizontal format information होती है
- timing pattern दोनों lines को काटते हुए गुजरता है
- quiet zone QR code के आसपास की white border है
- यह scanner को QR code की शुरुआत और अंत identify करने में मदद करती है
mask pattern हटाना
- QR code बड़े black blocks या white blocks से बचने के लिए mask का इस्तेमाल करता है
- mask के कुल 8 options होते हैं
- example में mask pattern bits check करने के लिए black module को 1 और white module को 0 के रूप में पढ़ा जाता है
- example bits binary
110हैं 110decimal 6 के बराबर है
- example bits binary
- हर mask type का एक predefined pattern होता है
- example QR code का pattern black-and-white rainbow के एक हिस्से जैसा दिखने वाला pattern है
- mask को data area के ऊपर repeat करके रखें, फिर mask में जहाँ black module हो, उन positions पर QR code modules को flip करें
- सभी mask types की cheat sheet वाली DIY zine उपलब्ध है
- छोटी booklet की तरह fold करने का example इस guide image में देखा जा सकता है
encoding mode और पढ़ने का order
- content decode करने की शुरुआत पहले encoding mode check करने से होती है
- encoding information हमेशा नीचे दाएँ कोने में होती है
- encoding mode को भी पहले mask apply करके हटाना होता है
- example में cheat sheet देखकर दो boxes को XOR किया जाता है
- encoding modes में Numeric, Alphanumeric, Byte, ECI, Kanji आदि शामिल हैं
- example QR code का encoding mode Byte(4) है
- content नीचे दाएँ कोने से शुरू होता है
- दो columns के बीच zigzag में ऊपर जाते हुए पढ़ें
- फिर बाईं ओर के अगले दो columns में zigzag में नीचे आएँ
- सभी special areas हमेशा skip करें
length और bytes decode करना
- पहले 4 bits encoding mode होते हैं
- Byte mode में अगले 8 bits content length specify करते हैं
- इसके बाद हर 8 bits एक content byte बनते हैं
- length information को भी mask apply करके हटाना होता है
- example की mask हटाई गई length information
00001100है- decimal में
12 - इसका मतलब total content length 12 bytes है
- decimal में
- पहला mask हटाया गया byte
01001000है- hexadecimal में
0x48 - उससे मेल खाने वाला ASCII character
Hहै
- hexadecimal में
- दूसरा mask हटाया गया byte
01100101है- hexadecimal में
0x65 - उससे मेल खाने वाला ASCII character
eहै
- hexadecimal में
- बाकी bytes practice के लिए छोड़े गए हैं; पहले पढ़ी गई length field जितने characters बताए, उतने पढ़कर रुक सकते हैं
ASCII table और error correction
- ASCII table का इस्तेमाल करके hexadecimal values को characters में बदला जा सकता है
- lowercase letters में
a0x61से शुरू होता है औरz0x7Aपर खत्म होता है- बीच के characters गिनकर खोजे जा सकते हैं
- बाकी बचा हर area content नहीं होता
- QR code में error correction भी शामिल होता है
- इससे कुछ हिस्सा damaged, blurred या missing होने पर भी QR code पढ़ा जा सकता है
- error correction mathematics से generate होता है, लेकिन हाथ से पढ़ने के उद्देश्य में इसे cover नहीं किया जाता
- simple QR code को हाथ से decode करने की प्रक्रिया सीखने के बाद, random code button से छोटे English words की practice की जा सकती है, या Scan code button से actual QR code scan किया जा सकता है
- source code Codeberg पर है
- UTF-8 encoding mode समझाने वाले PR का विशेष स्वागत है
1 टिप्पणियां
Hacker News की राय
90 के दशक के आखिर या 2000 के दशक की शुरुआत में मैं Atari 8-bit डिस्क की सामग्री को PC पर ले जाना चाहता था
मुझे Atari के SIO पोर्ट और PC serial port को जोड़ने वाले SIO2PC केबल और software के बारे में पता था, लेकिन उस समय मेरे पास उसे खुद बनाने लायक electronics skills नहीं थीं
आखिरकार मैंने Atari पर एक Basic प्रोग्राम लिखा जो डिस्क को sector-दर-sector पढ़ता था, और उसे graphics mode 3 के बड़े 4-color pixels के रूप में स्क्रीन पर बनाता था; फिर Atari को PC के TV card से जोड़ा और एक Delphi प्रोग्राम से लगातार screenshots लेकर डेटा decode करवाया
खाली sectors की वजह से pixel position correction बिगड़ जाती थी, इसलिए मैंने mask pattern, checksum, और sector address तक जोड़ दिए, और उस तरीके से डिस्क की पूरी सामग्री PC पर ले जा सका
आज भी मैं इसे अपनी सबसे बड़ी engineering achievement मानता हूँ
लगभग 10 साल बाद मैंने AspeQt नाम का SIO2PC प्रोग्राम बनाया, और उसका नया community fork RespeQt आज भी इस क्षेत्र में सबसे ज़्यादा इस्तेमाल होने वाला tool है; AtariAge पर इसका dedicated subforum भी है: https://forums.atariage.com/forum/184-respeqt-sio2pc-softwar...
कहा जाता है कि LCD backlight से bit pattern blink कराया गया था और camera से वह डेटा पढ़ा गया था: https://mastodon.social/@bagder/111538350617290554
“error correction जटिल गणित है, इसलिए हाथ से पढ़ने में उसे नहीं देखते” वाली बात को थोड़ा और विस्तार चाहिए
गणित मुश्किल है, यह समझ में आता है, लेकिन error correction data आखिर में जुड़ता है, हर byte के बाद आता है, या बीच में डाला जाता है—यह जानने की जिज्ञासा है
अगर QR code खराब न हुआ हो, तो क्या error correction मौजूद होने पर भी गणित वाले हिस्से को छोड़कर उसे हाथ से पढ़ा जा सकता है, यह भी जानना चाहूँगा
% 10जैसी गणना की जाती है, जिससे 0~9 में से एक मान मिलता हैइसलिए डेटा गलत होने पर भी संयोग से checksum सही निकलने की संभावना 1/10 होती है, और वैसे भी आख़िरी अंक वास्तविक product के unique barcode ID के लिए महत्वपूर्ण नहीं होता
Home Depot में return करने जा रहे सामान के barcode का checksum digit फटकर खराब हो गया था; मैं manual lookup से पहले उसे खुद गणना करने के लिए बेतहाशा जल्दी कर रहा था, लेकिन आखिरकार कर्मचारी मुझसे तेज़ निकला, और वह बात आज तक नहीं भूला हूँ
https://www.gs1.org/services/how-calculate-check-digit-manua...
https://www.simplybarcodes.com/barcode_check_digit_calculato...
उसके बाद size और error correction level के अनुसार bitstream को blocks में बाँटा जाता है, हर block के लिए error correction data निकाला जाता है, और फिर blocks को interleave किया जाता है
इसलिए यह तरीका error correction level की परवाह किए बिना QR version 5 से आगे विफल हो जाता है, और version 3~5 में भी high error correction level होने पर काम नहीं करता
व्यवहार में, जानकारी के प्रकार के अनुसार Reed-Solomon और BCH नाम के दो थोड़े अलग codes इस्तेमाल होते हैं
https://www.quaxio.com/an_artisanal_qr_code.html
संबंधित पोस्टें:
Decoding small QR codes by hand (2012) - https://news.ycombinator.com/item?id=36173441 - जून 2023, 69 टिप्पणियाँ
How a QR code works - https://news.ycombinator.com/item?id=32837565 - सितंबर 2022, 114 टिप्पणियाँ
Creating a QR Code step by step - https://news.ycombinator.com/item?id=24119124 - अगस्त 2020, 41 टिप्पणियाँ
Creating a QR Code step by step - https://news.ycombinator.com/item?id=18360847 - नवंबर 2018, 34 टिप्पणियाँ
लेख खुद भी शानदार है, लेकिन यह बात और भी बढ़िया है कि input value के अनुसार सभी चित्रों को dynamically generate किया जाता है
QR code पढ़ने के तरीके की व्याख्या अच्छी लगी, और सामान्य UPC जैसे 1-dimensional barcodes को decode करने पर यह लेख भी ठीक है:
https://scanbot.io/blog/how-do-barcodes-work/
करीब 10 साल पहले मैंने QR code को हाथ से पढ़ने की कोशिश की थी, लेकिन mask pattern की वजह से हार मान ली थी
data type पता करने से पहले भी इस mask pattern को XOR के साथ लागू करना पड़ता है
सोचता हूँ कि यह mask pattern असली QR code reader में कितना मददगार होता है
पिछले महीने मैंने optimal error correction setting भी देखी थी, लेकिन जब मामला स्क्रीन पर दिख रहे पूरे matrix जैसा बिना नुकसान वाला हो, तो जवाब “कोई नहीं” था, और इस निष्कर्ष तक पहुँचना आसान नहीं था
अलग-अलग settings और scanning implementations की वास्तविक परिस्थितियों में तुलना करने वाला कोई material नहीं मिला, और मैंने खुद स्क्रीन पर छोटे QR को कई error correction levels के साथ दिखाकर camera हिलाते हुए पढ़ने की समस्या की नकल भी की, लेकिन settings के बीच कोई meaningful फर्क नहीं दिखा
कम-से-कम चार alignment markers, बड़ा margin और timing pattern भी होते हैं, इसलिए लगता है कि mask न होने से सफेद धब्बे बन जाना क्या सच में इतना बड़ा फर्क पैदा करता है
QR को visually पढ़ने की कोशिश छोड़ने का दूसरा कारण यह था कि आम तौर पर नीचे URL alternative text के रूप में लिखा होता था, हालांकि बाद में कुछ बार बिना alternative text वाले मामले भी देखे, लेकिन वे बहुत दुर्लभ थे
इसे न इस्तेमाल करो तो message कम जगह लेता है और QR छोटा हो जाता है
अगर sticker printing की तरह fixed space में फिट करना हो, तो pixel को physically बड़ा बनाया जा सकता है, और reliable reading के लिए error correction से ज़्यादा बड़े pixel मददगार रहे
message की लंबाई के हिसाब से final QR size बदले बिना error correction level बढ़ाया जा सकता है, तो उस स्थिति में दोनों फायदे मिलते हैं
यह उन लोगों के लिए है जो tracking parameters से भरा पूरा URL version 25, 117x117 code में डालकर बड़े signboard पर चिपकाते हैं, ताकि उस पर पक्षियों की बीट गिर जाए या कोई sticker चिपका दे, तब भी data बचा रहे
experiment यह देखने का था कि कितने छोटे आकार में print करने पर भी detection संभव है, और बगल की comment की तरह लगता है कि वजह individual pixel का बड़ा होना है
करीब 10 साल पहले का QR decoding video: https://www.youtube.com/watch?v=KA8hDldvfv0 (20 मिनट)
QR code को step-by-step बनाने वाला मेरा interactive web page भी है। मूल रूप से यह reverse process है: https://www.nayuki.io/page/creating-a-qr-code-step-by-step
error correction को लेकर जिज्ञासा हुई, तो पता चला कि QR code को recoverable percentage 7% से 30% तक अलग-अलग तरह से design किया जा सकता है
दिलचस्प: https://docs.beaconstac.com/en/articles/6018654-what-is-erro...
Shannon ने 20वीं सदी के मध्य में इसकी सैद्धांतिक सीमा खोज ली थी, लेकिन उस सीमा तक पहुँचना कैसे है यह कोई नहीं जानता था
1990s में turbo code patent के साथ अचानक उस सीमा के करीब पहुँचा गया, तो अकादमिक जगत को इस पर यक़ीन करना मुश्किल लगा
बेशक, ऐसी तकनीकों की वजह से तेज़ और भरोसेमंद mobile network संभव हुए
2023 Mystery Hunt की एक derivative puzzle में ऐसा सवाल था, जिसमें error correction से भी recover न हो सकने जितना खराब QR code को हाथ से decode करना पड़ता था
इस comment section में आई सारी guides मैंने देखी थीं, और वे उपयोगी तो थीं, लेकिन बहुत शानदार नहीं थीं
इसलिए इस तरह के और ज़्यादा detailed लेख बढ़ना अच्छा है, और यह लेख निश्चित रूप से काफ़ी polished लगता है
अगर दिलचस्पी हो, तो puzzle यहाँ है, और QR decoding बाद के हिस्से में आता है: https://puzzles.mit.edu/2023/abcde.puzzlefactory.place/puzzl...
Wikipedia के मुताबिक QR code का आविष्कार 1994 में जापान की एक automotive parts manufacturer ने automobile parts labeling के लिए किया था
सोचता हूँ कि अगर इसका आविष्कार आज होता, तो क्या इसे और बेहतर बनाया जा सकता था
क्या इसे और छोटा या पढ़ने में और आसान बनाया जा सकता था?
1994 में भी barcode पहले से हर जगह थे, लेकिन इससे QR code के उभरने पर रोक नहीं लगी
शायद बहुत ज़्यादा सुधार की गुंजाइश ही न हो। जब तक कि concept को बहुत बदलकर NFC जैसी किसी चीज़ की ओर न जाया जाए