viernes, 11 de marzo de 2022

¿Cómo se codifica la información en un QR?

Ahora, con el COVID, se han vuelto omnipresentes. Aunque ya llevan tiempo con nosotros (fueron  "inventados" en 1994 por el japonés Masahiro Hara, inicialmente para ser utilizados en la identificación de vehículos y componentes en las fábricas). Por cierto, QR significa "Quick Response", respuesta rápida.

Siempre me ha intrigado saber cómo está codificada la información en esos cuadrados. La respuesta fácil te la da el "amigo enterao": "pues está claro, Ángel, los cuadraditos negros son 1´s y los blancos 0´s. Es un código binario y ya está". Muy fácil. Pero no suficiente para una mente curiosa. O sea que, si me acompañas, vamos a descubrir juntos "todo aquello que siempre quiso saber sobre cómo funciona un código QR y nunca se atrevió a preguntar". Bueno, todo, todo, no, que sería muy árido...

Para empezar con algo más fácil, vamos a observar el código de barras, antecesor del QR. El que está en la etiqueta de todos los productos del supermercado. Que responde, básicamente, a dos estándares: el europeo EAN-13 (European Article Number) que tiene 13 dígitos o el americano (o universal, si se quiere) UPC (Universal Product Code) que tiene 12 dígitos.


Como la mejor figura que he encontrado para explicar la codificación corresponde a un código UPC, es el que uso para el ejemplo. En éste, el 4 indica el tipo de código que es (lo normal es que lleven 0,1 o del 6 al 9, el 2 está reservado a los artículos que se pesan en la tienda, el 3 a los artículos de farmacia, ...) 24886 es el código del fabricante, 50152 es el código del artículo y 7 es el dígito de control, que es el que nos garantiza que el lector ha interpretado correctamente toda la información. (En el código EAN-13, los 3 primeros dígitos indican el país del fabricante; así, todos los códigos que empiezan por 840-849 son de España; 560 Portugal y por 370-379 Francia). 












Lo que nos interesa saber es que, a cada dígito le corresponden 7 barras verticales (en la figura, las sucesivas porciones de color violeta y gris). Lo que hace que unas barras (blancas o negras) parezcan más anchas es porque hay dos o tres juntas. El código empieza y termina con la misma serie: 101 (resaltado en amarillo en el ejemplo, y gráficamente las barras son un poco más largas); es lo que le permite al lector saber cuándo empieza y cuándo termina el código. También en el centro hay una serie que separa la mitad izquierda de la derecha: 01010, en amarillo.

Ahora, si empiezas a leer la fila de 0´s y 1´s que se han insertado en la parte superior de las barras, desde la primera franja violeta de la izquierda, puedes ver que:

0100011 es el código para el dígito 4
0010011 para el 2
0100011 otro 4
0110111 para el 8
y así sucesivamente.

O sea que, dándole la razón a mi amigo, el procesador asociado al lector sólo tiene que interpretar bien el ancho de las columnas, traducirlo a 1´s y 0´s, y convertir ese código binario a dígitos usando una tabla de conversión.

La cosa tiene una pequeña complicación. Si te fijas, en la columna que corresponde al 2 de la parte derecha, el código es "1101100", que no es el mismo que el que habíamos visto en la mitad izquierda, sino su imagen especular (donde en uno hay un 1 en el otro hay un 0, y a la inversa). Los he puesto en negrita para que se vea mejor. La explicación, sin entrar en muchas profundidades, es que así el procesador del lector sabe si está leyendo el código en posición "derecha" o "invertida" (fíjate que en el súper se pasan los códigos sin mirar su posición), e interpretar correctamente qué código es el de la mitad izquierda y cuál el de la mitad derecha.

Bien, pues superado el nivel "barras" vamos a por el "cuadraditos". Los códigos QR pueden ser desde 21x21 (21 filas y 21 columnas) hasta de 177x177. Lógicamente, cuantos más cuadraditos, más elementos de información pueden contener. Vamos a usar también un ejemplo sencillo, sacado de la Wikipedia (la lógica es similar en los más complejos). De momento no trates de entender las explicaciones de la imagen. Sigue leyendo...


Si cuentas con cuidado, verás que tiene 21 filas y 21 columnas. Los tres cuadrados grandes que destacan en las tres esquinas están presentes en todos los QR. Sirven para establecer la posición "correcta" del QR. Los cuadraditos rojos, rosas, blancos y negros del QR de la imagen, que están siempre en la misma posición, sirven para indicar el tipo de codificación, el formato, etc... cosas interesantes para el procesador del lector, pero que a nosotros nos basta con saber que existen y que están ahí.

Ahora sí, nos fijamos en los cuadrados grises, claros y oscuros, que es donde está el "contenido" del QR. Que empieza por la parte inferior derecha del cuadro (yo creo que esto es porque en japonés, de donde procede el invento, es la forma de leer un texto: de abajo arriba y de derecha a izquierda). Y sigue la dirección indicada por las flechas.

El primer bloque de 4 cuadraditos, el que pone "Enc" indica el tipo de caracteres que van en el mensaje: solo números, alfanumérico, bytes o kanji. A continuación, siguiendo la flecha está el bloque "Len", que indica la longitud del mensaje. Como en este ejemplo el mensaje es  www.wikipedia.com le dirá al lector que el mensaje tiene 17 caracteres (o bloques). De todas formas, hay un bloque "End" que indica el final del mensaje. Y después, siguiendo la dirección de las flechas, los bloques "E1-E7", los de corrección de errores, que permiten completar correctamente la información aunque alguno de los bloques esté deteriorado o incluso ausente. En este caso hay siete.

Lo que es bastante enrevesado, y no me preguntes por qué es así porque no lo sé, es cómo se traduce cada bloque de cuadraditos grises claros y oscuros a un código de 0´s y 1´s. Lo pone en la imagen. O sea que, en las filas pares los cuadraditos oscuros son 0´s y los grises 1´s, mientras que en las filas impares es al revés. Y dependiendo de la orientación del bloque, la secuencia de lectura de los 8 cuadraditos es diferente. 

Si te fijas en el bloque de la primera "w", como empieza en fila impar, oscuro es 1 y claro es 0. Y en la siguiente hacia arriba, al revés. O sea que, siguiendo la secuencia de lectura que indica la imagen, el código para la primera "w" sería "01110111". Si hacemos lo mismo para la segunda, tendríamos "10001000", que es la imagen especular de la primera. La tercera, la que va hacia abajo vuelve a ser "01110111", y la cuarta "w", la que va después del ".", otra vez 10001000". Pues, complicado de descifrar, pero así es: cada bloque de 8 cuadraditos se traduce en un código binario que, a su vez, tiene su correspondiente dígito según una tabla. Lo de cómo funcionan los bloques que permiten corregir errores o ausencias es "para nota", o sea que se lo dejamos a los "tekkies". 

Para terminar, sólo comentar que los códigos no tienen que ser cuadrados en blanco y negro; pueden ser de colores, y, aprovechando la función de corrección de errores, que una imagen publicitaria ocupe una parte del cuadrado. Por ejemplo:


Y, para aprovechar el tema, te pido que cojas tu teléfono móvil, conectes la cámara y la enfoques al QR que he puesto al comienzo este artículo... A ver adónde te lleva  ;-)

1 comentario: