Código Aztec
# Código Aztec

El Código Aztec es un tipo de código bidimensional inventado y patentado por los estadounidenses Andrew Longacre Jr. y Robert Hussey en 1995. El código fue publicado por la Association for Automatic Identification and Mobility de Estados Unidos en el año 1997. Aunque el código Aztec fue patentado, la patente fue dedicada al dominio público, como ocurrió con otros códigos bidimensionales, por deseo expreso de los inventores. El código Aztec es también publicado como estándar internacional bajo el número ISO/IEC 24778:2008. Nombrado por su semejanza con la vista aérea de una pirámide azteca, el código Aztec usa menos espacio que otros códigos matriciales porque no requiere una "zona tranquila" o de silencio circundante.

## Estructura

El símbolo se construye sobre una cuadrícula con un patrón de "ojo de buey" en su centro para localizar el código. Los datos son codificados en anillos cuadrados concéntricos alrededor del "ojo" el cual es de 9 × 9 o 13 × 13 píxeles de tamaño y está rodeado de una fila de píxeles que representa los parámetros básicos de codificación, produciendo un "núcleo" cuadrado de 11 × 11 píxeles denominado "Runa Aztec". Los datos se añaden en "capas", cada una conteniendo dos anillos de píxeles, dando símbolos de dos tamaños diferentes:

* Compacto: Símbolo de 15 x 15 hasta 27 x 27 píxeles, con incrementos en pasos de 4 píxeles en cada dirección.
* Completo: Símbolo de 19 x 19 hasta 151 x 151 píxeles, incrementos en pasos de 4 píxeles en cada dirección y hasta 6 en cierto casos para permitir la existencia de una cuadrícula de referencia.

Las esquinas del núcleo incluyen marcas de orientación, permitiendo que el código se lea si se gira o se refleja. La decodificación comienza en la esquina con tres píxeles negros, y procede en el sentido de las agujas del reloj hasta las esquinas con dos, uno y cero píxeles negros. Los píxeles variables en el núcleo central codifican el tamaño, por lo que no es necesario marcar el límite del código con una "zona tranquila" en blanco, aunque algunos lectores de código de barras requieren una.

* El núcleo del código Aztec compacto (sombreado en rojo claro), que muestra el ojo de buey central, las cuatro marcas de orientación (sombreado en cruz en azul claro) y el espacio para 28 bits (7 bits por lado) de información de codificación (sombreado horizontal verde claro). El primer anillo de datos comienza en el área con sombreado gris claro.
* El núcleo del código Aztec completo. 40 bits están disponibles entre las marcas de orientación para los parámetros de codificación.
* Los Datos de Mensaje (rojo) son colocados en un patrón espiral alrededor del núcleo del código. El Mensaje de Modo comienza con la cadena binaria "01011100", indicando la subcadena más siginificativa "01" 2 capas $(01_2+1=2_{10}),$ y la subcadena $"011100"_2$ 29 capas $(011100_2+1$ = $29_{10})$ de palabras de código (de 6 bits cada una).

El núcleo del código Aztec compacto puede estar rodeado de 1 a 4 capas, produciendo símbolos de 15 × 15 (espacio para 13 dígitos o 12 letras) hasta 27 × 27. El núcleo completo admite hasta 32 capas y 151 × 151 píxeles, que pueden codificar 3832 dígitos, 3067 letras o 1914 bytes de datos. Cualquier parte del símbolo no utilizada para los datos básicos se usa para la corrección de errores Reed-Solomon, y es completamente configurable, entre los límites de 1 palabra de datos, y 3 palabras de verificación. El número recomendado de palabras de verificación es el 23% de la capacidad del símbolo más 3 palabras de código.

El código Aztec se supone que produce códigos legibles con varias tecnologías de impresora. También es adecuado para pantallas de teléfonos celulares y otros dispositivos móviles.

## Codificación

El proceso de codificación consta de los siguientes pasos:

* Conversión del mensaje de origen en una cadena de bits.
* Cálculo del tamaño de símbolo y el mensaje de modo necesarios, lo cual determina el tamaño de la palabra de código Reed-Solomon.
* Rellenado de bits del mensaje en palabras de código Reed-Solomon.
* Relleno del mensaje a un límite de palabra de código.
* Adición de palabras de código de verificación.
* Disposición del mensaje completo en una espiral alrededor del núcleo.

Todas las conversiones entre cadenas de bits y otras formas se realizan de acuerdo con la convención big-endian (bit más significativo primero).

### Capacidad de almacenamiento

Según el tamaño y la cantidad de capas, un Código Aztec puede almacenar determinada cantidad de información. La siguiente tabla muestra algunos de los casos posibles, tanto en los casos de códigos compactos como completos.

| Número de capas | Tamaño del símbolo | Capacidad de datos |
| - | - | - |
| 1 (compacto) | 15x15 | 13 dígitos, 12 letras, 6 bytes |
| 1 (completo) | 19x19 | 18 dígitos, 15 letras, 8 bytes |
| 2 (compacto) | 19x19 | 40 dígitos, 33 letras, 19 bytes |
| 2 (completo) | 23x23 | 49 dígitos, 40 letras, 24 bytes |
| 3 (compacto) | 23x23 | 70 dígitos, 57 letras, 33 bytes |
| 10 | 57x57 | 516 dígitos, 414 letras, 256 bytes |
| 20 | 101x101 | 1653 dígitos, 1324 letras, 824 bytes |
| 32 | 151x151 | 3832 dígitos, 3067 letras, 1914 bytes |

### Conjunto de caracteres

Cada símbolo del Código Aztec consta de valores de 8 bits (1 byte, desde 0 hasta 255 en base decimal) los cuales son codificables. Por defecto, los códigos desde el 0 hasta el 127 se interpretan como caracteres ASCII y desde el 128 hasta el 255 son caracteres del Alfabeto Latino N°1 establecidos en el estándar ISO 8859-1. Los bytes se traducen en códigos de 4 y 5 bits, con códigos de desplazamiento (shift, en idioma inglés) y de retención (latch) para cambiar modos. Los valores de byte no disponibles de esta manera pueden codificarse usando un código general de "desplazamiento binario", el cual es seguido por una longitud y un número de códigos de 8 bits. Además se codifican dos caracteres que no son de datos:

* FNC1 (Function Code One, Código de función 1 en castellano), un símbolo usado para identificar y separar los campos para identificadores de aplicación de longitud variable.
* ECI, un símbolo de escape seguido de un código de 6 dígitos de protocolo Extended Channel Interpretation (Interpretación de Canal Extendido, en castellano) que especifica el conjunto de caracteres utilizado para interpretar los bytes siguientes.

Cada uno de los bytes que conforma el símbolo se codifica en uno de 5 conjuntos de códigos posibles: Superior (valor inicial por defecto), Inferior, Mixto, Puntuación y Dígito. Los dos primeros conjuntos se refieren a caracteres alfabéticos en mayúsculas y minúsculas, respectivamente; el conjunto mixto contiene una mezcla de caracteres de control y de puntuación; el conjunto de puntuación contiene caracteres de puntuación y sus combinaciones y el conjunto de dígitos contiene números y algunos caracteres de puntuación. Para cambiar entre los conjuntos de códigos, un código de desplazamiento afecta solamente a la interpretación del código siguiente, mientras que un código de retención afecta a todos los códigos siguientes. La mayoría de los modos utiliza códigos de 5 bits, pero el modo Dígito utiliza códigos de 4 bits. La siguiente tabla describe la codificación de caracteres con el código Aztec al como se describe en el estándar ISO/IEC 24778:2008.

Codificación de caracteres en el Código Aztec :

| Código | Modo | Modo | Modo | Modo | Modo | Código | Modo | Modo | Modo | Modo |
| - | - | - | - | - | - | - | - | - | - | - |
| Código | Superior (S) | Inferior (L) | Mixto (M) | Puntuación (P) | Dígito (D) | Código | Superior (S) | Inferior (I) | Mixto (M) | Puntuación (P) |
| 0 | P/S | P/S | P/S | FLG(n) | P/S | 16 | O | o | ^\ | + |
| 1 | SP | SP | SP | CR | SP | 17 | P | p | ^] | , |
| 2 | A | a | ^A | CR LF | 0 | 18 | Q | q | ^^ | - |
| 3 | B | b | ^B | . SP | 1 | 19 | R | r | ^_ | . |
| 4 | C | c | ^C | , SP | 2 | 20 | S | s | @ | / |
| 5 | D | d | ^D | : SP | 3 | 21 | T | t | \ | : |
| 6 | E | e | ^E | ! | 4 | 22 | U | u | ^ | ; |
| 7 | F | f | ^F | " | 5 | 23 | V | v | _ | < |
| 8 | G | g | ^G | # | 6 | 24 | W | w | ` | = |
| 9 | H | h | ^H | $ | 7 | 25 | X | x | | | > |
| 10 | I | i | ^I | % | 8 | 26 | Y | y | ~ | ? |
| 11 | J | j | ^J | & | 9 | 27 | Z | z | ^? | [ |
| 12 | K | k | ^K | ' | , | 28 | L/L | U/S | L/L | ] |
| 13 | L | l | ^L | ( | . | 29 | M/L | M/L | U/L | { |
| 14 | M | m | ^M | ) | U/L | 30 | D/L | D/L | P/L | } |
| 15 | N | n | ^[ | * | U/S | 31 | B/S | B/S | B/S | U/L |

Donde:

* x/S = Conjunto "x" de caracteres desplazado que solo afecta a un carácter. "x" representa cualquiera de los conjuntos de caracteres (U, L, M, P y D)
* x/L = Conjunto "x" de caracteres retenido que afecta a los siguientes caracteres.
* B/S = Desplazamiento a binario de 8 bits.

B/S (binary shift, desplazamiento binario) es seguido por una longitud de 5 bits. Si no es cero, esto indica que se siguen los códigos 1 a 31 son de 8 bits. Si es cero, 11 bits de longitud adicional codifican el número de bytes siguientes menos el código 31. Al final de la secuencia binaria, se reanuda el modo anterior.

FLG(n) es una "bandera" donde n es un valor de 3 bits. N = 0 codifica a FNC1. Si n va de 1 a 6, es seguido por los dígitos del 1 al 6 (en modo de dígito) que son rellenados con ceros para hacer un identificador de 6-bit ECI. El valor n = 7 está reservado y actualmente es ilegal.

### Mensaje de modo

El mensaje de modo es una cadena de bits que rodea el patrón de búsqueda del código y que Incluye bits que indican el tamaño del símbolo, la longitud del mensaje, y bits que proporcionan el mensaje de modo con redundancia de errores. El mensaje de modo codifica el número de capas (L capas codificadas como el entero L-1), y el número de palabras de código de datos (D palabras de código, codificadas como el entero D-1) en el mensaje. Todas las palabras clave restantes se utilizan como palabras clave de verificación. Para los códigos Aztec compactos, el número de capas se codifica como un valor de 2 bits y el número de palabras de código de datos como un valor de 6 bits, dando como resultado una palabra de modo de 8 bits. Para los códigos Aztec completos, el número de capas se codifica en 5 bits, y el número de palabras de código de datos se codifica en 11 bits, haciendo una palabra de modo de 16 bits.

La palabra de modo se divide en 2 o 4 palabras de código de 4 bits en un campo finito de 16 bits, y se añaden 5 o 6 palabras de verificación de Reed-Solomon, haciendo un mensaje de modo de 28 o 40 bits, que está "envuelto" en una capa de 1 píxel alrededor del núcleo. Debido a que una capa L + 1 del código Aztec compacto puede contener más datos que un código completo de capa L, los códigos completos con menos de 4 capas se utilizan raramente. Lo más importante es que el número de capas determina el tamaño de las palabras clave Reed-Solomon utilizadas el cual es función de los polinomios de error, detallados en la tabla que sigue:

Polinomios de campo finito del Código Aztec :

| Palabra de Código (bits) | Campo finito (bits) | Polinomio | Capas |
| - | - | - | - |
| 4 | 16 | $x^4+x+1$ | Mensaje de modo |
| 6 | 64 | $x^6+x+1$ | 1 a 2 |
| 8 | 256 | $x^8+x^5+x^3+x^2+1$ | 3 a 8 |
| 10 | 1024 | $x^{10}+x^3+1$ | 9 a 22 |
| 12 | 4096 | $x^{12}+x^6+x^5+x^3+1$ | 23 a 32 |

El tamaño de la palabra de código $b$ es el número par más pequeño que asegura que el número total de palabras de código en el símbolo es menor que el límite de $2b-1$ que puede ser corregido por un código Reed-Solomon. Como se mencionó anteriormente, se recomienda que al menos el 23% de las palabras de código disponibles, más 3, estén reservados para la corrección, y se elija un tamaño de símbolo tal que el mensaje se ajuste al espacio disponible.

### Relleno de bits

Los bits de datos se dividen en palabras de código, correspondiendo el primer bit al coeficiente más significativo. Al hacer esto, se evitan las palabras de código de todos-ceros y de todos-unos mediante el relleno de bits: si los primeros $b-1$ bits de una palabra de código tienen el mismo valor, se inserta un bit adicional con el valor complementario en el flujo de datos. Esta inserción tiene lugar independientemente de si el último bit de la palabra de código hubiera tenido o no el mismo valor. Esto sólo se aplica a cadenas de $b-1$ bits al principio de una palabra de código. Se permiten cadenas más largas de bits idénticos siempre y cuando eludan un límite de palabra de código.

Cuando se descodifica, se puede suponer que una palabra de código de todos-ceros o de todos-unos es un borrado y se corrige más eficientemente que un error general. Este proceso hace que el mensaje sea más largo y el número final de palabras de código de datos grabadas en el mensaje de modo no se conoce hasta que se complete. En casos raros, puede ser necesario saltar al siguiente símbolo más grande y comenzar el proceso de nuevo para mantener la fracción mínima de palabras de verificación.

### Relleno

Después del relleno de bits, la cadena de datos se rellena al siguiente límite de palabra de código añadiendo "unos". Si esto resulta en una palabra de código de todos-unos, el último bit se cambia a cero (y será ignorado por el decodificador como un bit de relleno). En la decodificación, los bits de relleno se pueden decodificar como códigos de desplazamiento y de retención, pero eso no afectará al contenido del mensaje. El lector debe aceptar e ignorar un código parcial al final del mensaje, siempre y cuando sea de todos-unos. Además, si el número total de bits de datos disponibles en el símbolo no es un múltiplo del tamaño de palabra de código, la cadena de datos está prefijada con un número apropiado de "ceros" para ocupar el espacio adicional. Estos bits no se incluyen en el cálculo de palabras de verificación.

### Palabras de código de verificación

Tanto la palabra de modo como los datos deben tener las palabras de verificación agregadas para completar el espacio disponible. Esto se calcula agregando K palabras de verificación de manera que todo el mensaje es un múltiplo del polinomio Reed-Solomon dado por $(x-2)(x-4)\cdots (x-2^{K})$.

Debe tenerse en cuenta que las palabras de verificación no están sujetas a relleno de bits, y pueden ser de todos-ceros o todos-unos. Por lo tanto, no es posible detectar el borrado de una palabra de verificación.

### Trazado del código

Un símbolo de código Aztec completo tiene, además del núcleo, una "cuadrícula de referencia" formada por líneas de píxeles alternantes en blanco y negro que ocupan cada 16.ª fila y columna. Estos píxeles permiten que un lector mantenga la alineación con la cuadrícula sobre símbolos grandes. Para un máximo de 4 capas (31 × 31 píxeles), la cuadrícula consta sólo de líneas individuales que se extienden hacia fuera desde el núcleo, continuando el patrón alternante. Dentro de la quinta capa, sin embargo, se insertan filas y columnas adicionales de píxeles alternos ± 16 píxeles desde el centro, por lo que la quinta capa se sitúa ± 17 y ± 18 píxeles desde el centro.

Del mismo modo, las filas y columnas adicionales de la cuadrícula de referencia se insertan ± 32 píxeles desde el centro, haciendo un símbolo de 12 capas de 67 × 67 píxeles. El patrón continúa indefinidamente hacia afuera, con bloques de 15 píxeles de datos separados por filas y columnas de la cuadrícula de referencia.

Una forma de construir el símbolo es borrar completamente la cuadrícula de referencia y comenzar con un núcleo de 14 × 14 píxeles centrado en un cuadrado blanco de 2 × 2 píxeles. A continuación, se divide en bloques de 15 × 15 píxeles y se inserta la rejilla de referencia entre ellos.

El mensaje de modo comienza en la esquina superior izquierda del núcleo y lo envuelve en el sentido de las agujas del reloj en una capa de 1 bit de grosor. Comienza con el bit más significativo del número de capas y termina con las palabras de verificación. Para un código Aztec compacto, se dividE en cuatro pedazos de 7 bits para dejar espacio para las marcas de orientación. Un código Aztec completo, se divide en cuatro pedazos de 10 bits, y esas piezas se dividen a la mitad mediante la cuadrícula de referencia.

En algunos casos, la capacidad total de la matriz no se divide uniformemente por palabras de código completo. En estos casos, el mensaje principal se rellena con "ceros" en el principio. Estos bits no se incluyen en el cálculo de la palabra de comprobación y se deben omitir durante la decodificación. La capacidad total de la matriz para un símbolo completo se puede calcular como (112 + 16 * L) * L para un código Aztec completo y (88 + 16 * L) * L para un código compacto Aztec, donde L es el tamaño del símbolo en capas. Por ejemplo, la capacidad total de la matriz de un código compacto Aztec con una capa es de 104 bits. Dado que las palabras de código son de seis bits, esto da 17 palabras de código y dos bits adicionales. Dos "ceros" se añaden al mensaje como relleno y se deben omitir durante la decodificación.

El mensaje principal relleno comienza en la parte superior izquierda del símbolo completo y gira en espiral en sentido contrario a las agujas del reloj en una capa de 2 bits de grosor, terminando directamente encima de la esquina superior izquierda del núcleo. Esto coloca las palabras de datos rellenas de bits, para las cuales se pueden detectar códigos borrados, en las capas más exteriores del símbolo, que son más propensas a borrarse. Las palabras de verificación se almacenan más cerca del núcleo. La última palabra de verificación termina justo encima de la esquina superior izquierda del ojo de buey.

Con el núcleo en su orientación estándar, el primer bit de la primera palabra de datos se coloca en la esquina superior izquierda, con bits adicionales colocados en una columna de 2 bits de ancho De izquierda a derecha y de arriba abajo. Esto continúa hasta 2 filas desde la parte inferior del símbolo y continúa en una fila de 2 bits de alto, de abajo a arriba y de izquierda a derecha. Después de cuatro capas de igual tamaño, la espiral continúa con la esquina superior izquierda de la siguiente capa interna, terminando finalmente un píxel por encima de la esquina superior izquierda del núcleo. Finalmente, los "unos" del símbolo se imprimen como cuadrados negros y los "ceros" como cuadrados blancos.

## Utilización

### Transporte

Un código Aztec es utilizado por diversas empresas de transporte en el continente europeo como Eurostar y Deutsche Bahn, para sus boletos vendidos en línea e impresos por los clientes. Un código Aztec es utilizado por las empresas británicas Heathrow Express y East Coast en los boletos enviados a teléfonos móviles y exhibidos en sus pantallas, en los boletos impresos, y en los boletos solicitados en línea. La empresa danesa de ferrocarriles VR Group utiliza los códigos Aztec en cada tipo de boleto, excluyendo los vendidos a bordo. El código es escaneado por un escáner de mano por el personal del tren o en el torniquete para validar el boleto. Los quioscos de la empresa estadounidense NJ Transit imprimen boletos usando el formato de código Aztec, pero sus aplicaciones móviles usan el formato de código QR.

El código Aztec ha sido seleccionado por la industria aérea para los pases de embarque electrónicos. Varias aerolíneas envían códigos Aztec a los teléfonos móviles de los pasajeros, relacionados con la venta de boletos en línea (o sin papel).

### Gobierno

Los documentos de registro de vehículos en Polonia llevan un resumen encriptado codificado como código Aztec. En agosto de 2016 se anunció que el Bank Millennium SA de ese país sería la primera empresa en ofrecer el aseguramiento en línea de automotores tanto en una aplicación para teléfonos móviles inteligentes, como a través de su sistema de transacciones en línea Millenet.

