I codici QR sono un tipo di codice a barre bidimensionale in grado di memorizzare informazioni sia verticalmente che orizzontalmente. Sono composti da una matrice di punti (quadrati neri su sfondo bianco) che rappresentano dati: testi, URL (link), numeri di telefono e altre informazioni. Sono sempre più utilizzati, da tempo, per vari motivi: possono essere facilmente gestiti utilizzando dispositivi come smartphone o tablet dotati di fotocamera; leggere un codice QR richiede solo pochi secondi, rendendoli uno strumento rapido ed efficace per il trasferimento di informazioni; immagazzinano una grande quantità di dati rispetto ai tradizionali codici a barre lineari e sono molto versatili.
L’utilizzo dei codici QR, infatti, è diffuso in molteplici contesti: diventano strumenti per verificare biglietti e carte d’imbarco, per effettuare pagamenti digitali, sono utilizzati come etichette di prodotti, per la pubblicità, per l’accesso a menu digitali e via dicendo. È possibile usare un codice QR per condividere la password WiFi e si possono creare questi supporti anche in Windows, con una procedura tutto sommato piuttosto semplice.
L’applicazione Web “Reading QR codes without a computer“ fa il punto sul “funzionamento” dei codici QR, svelandone tutti i segreti. Per semplicità, è evitata la trattazione della parte relativa alla correzione dell’errore, cosa che richiedere l’introduzione di concetti più complessi.
La struttura di base di un codice QR
Ogni codice QR può avere una dimensione prestabilita ovvero essere composto da un certo numero di moduli (conservano 1 bit ciascuno). La versione più piccola è formata da 21×21 moduli ma è possibile incrementare di 4 “celle” sia in orizzontale che in verticale per ottenere codici QR più ampi.
In corrispondenza di tre dei quattro angoli, sono presenti i cosiddetti Finder pattern, forme quadrate che consentono agli scanner di riconoscere più facilmente il codice QR (in rosso nell’immagine che segue). La linea bianca (nella figura è evidenziata con il colore verde) che cinge il perimetro dei Finder pattern li separa dalle informazioni vere e proprie contenute all’interno del codice bidimensionale.
Altre accortezze grafiche che aiutano gli scanner di codici QR sono Alignment pattern e Timing pattern: i primi sono completamente assenti nella versione 21×21 mentre i secondi (in arancione) sono righe orizzontali e colonne verticali che alternano sempre celle vuote e piene (bianco/nere).
Mask pattern e correzione degli errori
Mask pattern ed error correction sono due concetti chiave nei codici QR: contribuiscono alla loro robustezza e permettono di correggere gli errori. Il mask pattern è un modello predefinito applicato al modulo di dati di un codice QR per migliorarne la leggibilità e la rilevazione degli errori. Serve a rendere più uniforme la distribuzione delle informazioni, riducendo le possibilità di errori di lettura causati da pattern ripetitivi o da aree troppo omogenee. Ci sono 8 diversi mask pattern disponibili.
La tecnica di error correction permette di leggere comunque le informazioni, anche se parte del codice QR dovesse risultare danneggiato o illeggibile. I livelli di correzione degli errori disponibili sono quattro (L, M, Q, H), ognuno dei quali offre un diverso grado di tolleranza agli errori. I livelli superiori richiedono più moduli per la correzione degli errori (a discapito del volume di dati che possono essere conservati), ma offrono una maggiore robustezza.
Le informazioni di formattazione, conservate sia in posizione verticale che in orizzontale, riassumono proprio l’utilizzo di mask pattern ed error correction (sono indicate in blu nell’immagine pubblicata poco sopra).
Leggere un codice QR senza computer e smartphone
Sebbene sia teoricamente possibile, leggere un codice QR senza computer e smartphone è un po’ una “provocazione” perché richiede lo svolgimento di una serie di passaggi non banali. L’idea, tuttavia, è quella di spiegare l’approccio iterativo che seguono i dispositivi dotati di uno scanner per QR code, che può essere ad esempio formato dall’accoppiata tra una fotocamera digitale (come quella che equipaggia smartphone e tablet) e un’applicazione “ad hoc”.
Il primo passaggio consiste nel cercare l’informazione sulla mask pattern che è collocata in una posizione ben precisa (nell’immagine è evidenziata in giallo).
Un modulo nero corrisponde al valore 1, un modulo bianco al valore 0. Nell’esempio, quindi, la mask pattern vale 110 che, con una conversione dal codice binario al codice decimale, restituisce 6.
L’operazione XOR sul contenuto grafico del codice QR
Abbiamo detto in precedenza che esistono 8 differenti tipi di mask pattern. Il valore contenuto nei moduli evidenziati in precedenza, suggerisce lo specifico mask pattern da usare (con un codice che va da 0 a 7). Il mask pattern va sovrapposto al codice QR originale modificando il contenuto dei moduli di dati in base al colore della cella.
Quando le celle nere del mask pattern si sovrappongono a celle nere del codice QR originale, queste diventano bianche. Al contrario, quando le celle nere del mask pattern si sovrappongono a celle bianche del codice QR originale, queste diventano nere. Infine, quando le celle bianche del mask pattern si sovrappongono a celle bianche del codice QR originale, queste rimangono bianche.
L’operazione che si compie è una disgiunzione esclusiva o XOR. Il processo, come accennato in precedenza, contribuisce a garantire una distribuzione uniforme dei dati nel codice QR, migliorando la leggibilità e la resistenza agli errori di lettura.
Il quadrato 2×2 nell’angolo inferiore destro del codice QR restituisce le informazioni sulla codifica, ovvero sulla tipologia di informazioni che il codice QR contiene. Esistono diverse modalità di codifica: la più versatile è byte perché consente la memorizzazione di informazioni binarie. È adatta per codificare testo in formato UTF-8, codifica che dà modo di rappresentare i caratteri speciali presenti in molte lingue.
Passare alla lettura dei dati
Completata con successo l’operazione di XORing, è possibile passare alla fase di lettura dei dati contenuti nel codice QR. L’acquisizione dei dati avviene partendo dall’angolo in basso a destra quindi procedendo “a zigzag”. Ovviamente, è necessario saltare le aree contenenti Finder, Alignement e Timing pattern, le informazioni sul formato e così via poiché si tratta di zone che non contengono dati utili. Per lo stesso motivo, va escluso il contenuto della prima cella 2×2 che restituisce, come visto in precedenza, le informazioni di codifica.
Se si ha a che fare con una “codifica byte“, il contenuto dei moduli che costituiscono il codice QR va acquisito a gruppi di 8 (1 byte = 8 bit), muovendosi dall’angolo in basso a destra e procedendo verso l’alto. Il primo byte restituisce la lunghezza della stringa, mentre dal secondo byte in poi si può estrarre, procedendo un carattere per volta, tutto il contenuto del codice QR.
Nell’esempio in figura, il codice QR precedentemente “XORato” a partire dal corrispondente mask pattern, presenta un valore “byte” nel riquadro in giallo (in basso a destra). Il primo gruppo di 8 bit (1 byte) corrisponde a 00001100
(sempre leggendo dal basso verso l’alto), ovvero al valore decimale 12. Significa che il codice QR in esame contiene una stringa lunga complessivamente 12 byte (nel nostro caso, il classico “Hello World!“).
Il primo gruppo di 8 bit in blu (01001000
) corrisponde al valore H in esadecimale ossia al primo carattere della stringa Hello World!. Proseguendo in verticale e verso sinistra, la stringa andrà via via a comporsi.
L’esadecimale 48 corrisponde proprio al codice ASCII del carattere “H” maiuscolo (verificare il valore HEX, ad esempio, in questa pagina).
Generare qualunque codice QR
Per sperimentare in proprio, l’applicazione Web disponibile qui consente di creare un codice QR inserendovi la stringa specificata dall’utente. Tutte le immagini proposte di seguito cambiano di conseguenza per aiutare ciascun utente a studiare ogni singolo caso specifico.
La stessa cosa si può fare scansionando qualsiasi codice preesistente ed è addirittura possibile richiedere la generazione di QR code a partire da termini inglesi generati in modo del tutto casuale.
Le immagini dei codici QR pubblicate nell’articolo, sono tratte da “Reading QR codes without a computer“.