Saltar al contenido
Vídeo

Cómo funcionan los códigos QR: por qué un código roto todavía se escanea

Un código QR guarda su mensaje más unos bytes de repuesto calculados a partir de él, así que el lector puede reconstruir los bytes rotos, manchados o tapados por un logo. Cuatro niveles, del 7 al 30% de las palabras de código, y tres cuadrados en las esquinas que no conviene tapar. Un explicativo de 48 segundos, cada cifra con su fuente.

Publicado
Lectura
7 min
Etiquetas
  • qr-codes
  • how-it-works
  • explainer
Contenido
  1. Roto, manchado, y se escanea
  2. Bytes de repuesto, calculados a partir del mensaje
  3. Dos bytes de repuesto por cada byte corregido
  4. Cuatro niveles: del 7 al 30%
  5. Un logo es un daño que se repara
  6. No tapes las esquinas
  7. Conclusión
  8. Fuentes

En resumen: un código QR no guarda solo su mensaje. Le añade bytes de repuesto calculados a partir de él, la corrección de errores Reed–Solomon, la misma matemática de los CD de música, así que el lector puede reconstruir bytes que faltan o están mal. Tú eliges cuántos: cuatro niveles, L, M, Q y H, recuperan alrededor del 7, 15, 25 y 30% de las palabras de código, y más bytes de repuesto hacen un código más grande. Por eso un logo en el centro puede funcionar: para el lector es un daño. Los tres cuadrados de las esquinas son otra cosa: no son datos, sirven para que el lector encuentre el código y lo enderece, así que la mayoría de los lectores los necesitan.

Roto, manchado, y se escanea

DENSO WAVE, la empresa que desarrolló el código QR: "QR Code has error correction capability to restore data if the code is dirty or damaged." (el código QR tiene capacidad de corrección de errores para recuperar los datos si el código está sucio o dañado). Y en su lista de características: "Data can be restored even if the symbol is partially dirty or damaged." (los datos se pueden recuperar aunque el símbolo esté parcialmente sucio o dañado).

El código del vídeo es real: dice oliverz.dev. Roto en una esquina, manchado en un borde y tapado por un logo en el centro, 13 de sus 44 palabras de código están mal, y aun así se decodifica (lo probamos con dos decodificadores, jsQR y ZXing).

Bytes de repuesto, calculados a partir del mensaje

DENSO WAVE: "The QR Code error correction feature is implemented by adding a Reed-Solomon Code… to the original data." (la corrección de errores del código QR se implementa añadiendo un código Reed-Solomon a los datos originales). La Computer Science Field Guide de la Universidad de Canterbury lo dice más simple: "it adds extra bits to the data so that errors can be corrected." (añade bits extra a los datos para que se puedan corregir los errores).

La unidad es la palabra de código. DENSO WAVE: "codeword is a unit that constructs the data area. One codeword of QR Code is equal to 8 bits." (la palabra de código es una unidad que forma el área de datos. Una palabra de código del código QR equivale a 8 bits). Y la CS Field Guide: "Each black or white square (“dot” or “module”) corresponds to one bit of data." (cada cuadrado negro o blanco, "punto" o "módulo", corresponde a un bit de datos). Así que ocho módulos forman un byte.

La matemática no es nueva. DENSO WAVE: "Reed-Solomon Code is a mathematical error correction method used for music CDs etc. The technology was originally developed as a measure against communication noise for artificial satellites and planetary probes." (el código Reed-Solomon es un método matemático de corrección de errores que se usa en los CD de música, entre otros. La tecnología se desarrolló originalmente contra el ruido en las comunicaciones de satélites artificiales y sondas planetarias).

Dos bytes de repuesto por cada byte corregido

DENSO WAVE: "Reed-Solomon Code requires twice the amount of codewords to be corrected." (el código Reed-Solomon necesita el doble de palabras de código de las que hay que corregir). La CS Field Guide: "The maximum number of errors that a Reed-Solomon code can correct is one half of the amount of extra error correcting data added to it." (el número máximo de errores que puede corregir un código Reed-Solomon es la mitad de los datos extra de corrección que se le añaden).

Nuestro código, en el nivel más alto, tiene 16 palabras de código del mensaje y 28 de repuesto, 44 en total. La mitad de 28 es 14, así que puede corregir hasta 14 palabras de código erróneas: 14 de 44 es alrededor del 32% (cálculo nuestro), el "Approx. 30%" (aprox. 30%) de DENSO. En nuestra prueba el límite estuvo justo ahí: con 14 palabras de código erróneas se leía, con 15 no daba resultado.

Ningún resultado, no uno equivocado. La CS Field Guide: "they won’t read the data incorrectly, instead they just refuse to give any data at all, rather than giving you incorrect data." (no leerán mal los datos; simplemente se niegan a dar ningún dato antes que darte datos incorrectos).

Cuatro niveles: del 7 al 30%

Del resumen del estándar (ISO/IEC 18004) de DENSO WAVE: "Level L Level M Level Q Level H Approx. 7% of codewords can be restored. Approx. 15% of codewords can be restored. Approx. 25% of codewords can be restored. Approx. 30% of codewords can be restored." (niveles L, M, Q y H: se puede recuperar aprox. el 7% de las palabras de código; aprox. el 15%; aprox. el 25%; aprox. el 30%).

El porcentaje cuenta palabras de código, no la superficie que ves: "*Data restoration rate for total codewords" … "QR Code therefore represents its error correction rate as a ratio of the total codewords." (*tasa de recuperación de datos sobre el total de palabras de código… por eso el código QR expresa su tasa de corrección de errores como una proporción del total de palabras de código).

Más bytes de repuesto ocupan sitio. DENSO WAVE: "Raising this level improves error correction capability but also increases the amount of data QR Code size." (subir este nivel mejora la capacidad de corrección, pero también aumenta la cantidad de datos y el tamaño del código QR). Y: "as the amount of data increases, more modules are required to comprise QR Code, resulting in larger QR Code symbols." (a medida que aumentan los datos, hacen falta más módulos para formar el código QR, y los símbolos son más grandes). Nuestros cuatro códigos de oliverz.dev, palabras de código del mensaje + de repuesto:

  • L: 19 + 7, 21 × 21 módulos
  • M: 16 + 10, 21 × 21 módulos
  • Q: 13 + 13, 21 × 21 módulos
  • H: 16 + 28, 25 × 25 módulos (en H, los 11 bytes de "oliverz.dev" ya no caben en 21 × 21)

Un logo es un daño que se repara

Por eso un logo en el centro puede funcionar: el lector lo trata como un daño y reconstruye lo que tapa. En nuestro código H, un logo de 7 × 7 módulos deja mal 9 de sus 44 palabras de código, dentro de su límite de 14.

Pero no sale gratis: gasta los bytes de repuesto. Las preguntas frecuentes de DENSO WAVE, sobre códigos con colores o con una ilustración: "If it is deformed, the QR Code's error correction function is invoked where even a tiny missing or smeared part renders the reading operation impossible, or the response of the operation may become slow." (si está deformado, se recurre a la corrección de errores del código QR, y entonces hasta una parte diminuta que falte o esté borrosa puede impedir la lectura, o hacerla más lenta).

No tapes las esquinas

Los tres cuadrados grandes no son datos. DENSO WAVE: "QR Code accomplishes this task through position detection patterns located at the three corners of the symbol." (el código QR lo consigue con patrones de detección de posición situados en tres esquinas del símbolo). Su historia del código cuenta que, gracias a ellos, "the orientation of their code could be determined regardless of the angle of scanning, which could be any angle out of 360°" (se podía determinar la orientación del código fuera cual fuera el ángulo de escaneo, cualquiera de los 360°).

La CS Field Guide: "Don’t colour in near the three large squares in the corners, as most QR scanners need these to align the image." (no pintes cerca de los tres cuadrados grandes de las esquinas, porque la mayoría de los escáneres QR los necesitan para alinear la imagen).

En nuestra prueba, una pegatina pequeña de 3 × 3 módulos en el centro de un cuadrado de esquina bastó para que los dos decodificadores fallaran, sin tocar ni un byte de datos. El logo tapa 49 módulos y se escanea; la pegatina tapa 9 y no.

Conclusión

  1. Un código QR guarda su mensaje más bytes de repuesto hechos a partir de él (Reed–Solomon), así que el lector reconstruye los bytes rotos, manchados o tapados.
  2. Tú eliges cuántos: L, M, Q, H, alrededor del 7 al 30% de las palabras de código; más bytes de repuesto, un código más grande. Un logo en el centro es un daño que cubren los bytes de repuesto.
  3. Los tres cuadrados de las esquinas no son datos: sirven para que el lector encuentre el código y lo enderece, así que la mayoría de los lectores los necesitan.

Fuentes

El vídeo está animado con código y el guion se escribió con ayuda de IA; cada cita de arriba está contrastada con su fuente, y la cifra marcada como "cálculo nuestro" es nuestra. Los códigos son reales (generados y luego decodificados con jsQR y ZXing), y también sus bytes y sus recuentos de palabras de código. Ilustrativo: la rotura, la mancha y el logo (una marca genérica, dibujada justo sobre los módulos que probamos), el visor de la cámara y el código inclinado, que es el mismo código dibujado en perspectiva. El desgaste real es menos ordenado que un daño dibujado siguiendo los módulos. "QR Code" es una marca registrada de DENSO WAVE INCORPORATED. El vídeo está narrado en inglés. Hecho con Shotloop, mi app gratis para Mac de explicativos hechos con código, corregidos plano a plano.

Más de How It Works

Lista en YouTube ↗
Sígueme

Comparto proyectos, experimentos y aprendizajes sobre la marcha.

Vídeos nuevos en YouTube, notas cortas en X. Cada artículo de aquí enlaza a ambos.

YouTube