Un QR Code ou Quick Response Code est une sorte de code barre amélioré qui sert à stocker des informations sous une forme lisible par un ordinateur : du binaire. Ainsi, dans un QR Code, chaque carré noir représente un 1 et chaque module blanc représente un 0. Ces carrés sont aussi appelés modules.
Voilà donc à quoi ressemblerait un QR Code si on le traduisait visuellement en 0 et en 1 :
Il existe différentes versions du QR Code : de la versions 1 avec 21 x 21 modules jusqu’à la version 40 avec 177 x 177 modules. Chaque version a une capacité de stockage de données et de correction d’erreur différents.
Prenons ici l’exemple simple de la première version du QR Code, d’une taille de 21 par 21 modules :
Les repères de positionnement. Ils vont permettre à l’ordinateur de distinguer le haut du bas ainsi que la droite de la gauche du QR Code
Une ligne horizontale et verticale dites de "timing". Situées entre les repères de positionnement avec un module sur deux noir, ces deux lignes en pointillés servent à indiquer au lecteur la taille des modules qui composent le QR Code, sa taille et donc sa version.
Le taux de correction. Il représente la quantité d’information que l’on peut perdre du QR Code et être toujours capable de le lire. Il y a 4 niveaux de correction possible :
Niveau L : environ 7 % de redondance
Niveau M : environ 15 %
Niveau Q : environ 25 %
Niveau H : environ 30 %
Le masque utilisé. Nous allons voir à quoi il sert par la suite.
La zone de redondance. Elle permet à l’aide d’opérations mathématiques complexes, en lien avec le taux de correction, de regénéré l’information en cas de perte.
La zone de stockage de l'information.
Le mode d'encodage de l'information. Il est indiqué par les 4 pixels en bas à droite. Il y a différents modes d'encodage :
Numérique : indiqué par 0001 (10 bits pour 3 chiffres)
Alphanumérique : indiqué par 0010 (11 bits pour 2 caractères)
Binaire : indiqué par 0100 (8 bits par caractère)
Kanji : indiqué par 1000 (13 bits par caractère)
Décoder le QR Code
Pour commencer, un QR Code se lit de bas en haut et de droite à gauche en suivant un tracé en forme de "zig-zag" :
Ensuite, lorsqu’il y a une suite de 0 ou une suite de 1, c’est à dire que plusieurs blocs de mêmes couleurs forment un ensemble plus grand, il devient difficile pour le lecteur de distinguer les modules.
Et c'est là que le masque intervient. Il est choisi par le générateur du QR Code au moment de la génération et lorsqu'il est appliqué, tous les modules ayant été recouvert par un pixel noir sont inversés.
Voici les 8 différents types de masques et leur codage :
Ainsi, dans notre exemple, nous avons le masque 0 qui a été appliqué à notre QR Code. Et pour retrouver visuellement l'information qui a été codée, il faut appliquer le masque à nouveau :
Ce qui donne ce QR Code :
On trouve ainsi comment a été encodé l'information :
Ici c'est en binaire.
Le codage étant en binaire la lecture de l'information va se faire par blocs de 8 modules.
Notons aussi que le premier bloc est un bloc informatif qui sert à donner la longueur de l'information codée. Ici ce segment en bit donne : 00001000 ce qui à l'aide de la table ASCII représente 8.
La chaîne codée dans nôtre exemple est donc longue de 8 caractères.
Le décodage du reste de l'information donne la suite de bits suivante :
Pour marquer la fin de l'information codée, une suite de 4 bits de 0 en début d'un nouveau bloc est utilisée. C'est le "terminator"... Littéralement.
Enfin, vous avez pu remarquer que la zone stockage de l'information n'est pas totalement utilisée. Pour pallier celà, nous utilisons une suite de bits appelés "byte padding" qui alterne en hexadécimal le codage de EC et 11 jusqu'au remplissage complet de la zone de stockage de l'information. Ici : le byte padding est : EC 11 EC soit en binaire : 111011000001000111101100
En résumé...
Pour lire un QR Code soi-même, il faut suivre les étapes suivantes :
Trouver quel masque est utilisé
Appliquer le masque
Voir quel type d’information est codé et appliquer la lecture en blocs correspondante. En binaire, nous avons donc des blocs de 8 bits mais celà change en fonction du mode d'encodage : 10 bits pour le mode numérique, 11 pour le mode alphanumérique et 13 bits pour les Kanji.
Isoler chacun des blocs
Lire les blocs avec le bon sens de lecture
Traduire les données
Être heureux d'avoir réussi à décoder un QR Code à la main alors qu'on aurait pu utiliser son téléphone