# Suma de comprobación en modo nativo

La suma de comprobación que utilizan los comandos de transferencia de archivos en modo nativo es una comprobación de redundancia cíclica (CRC) estándar de 16 bits. A continuación se presenta el algoritmo para calcular la CRC. En el ejemplo considerado, la variable CRC es de 16 bits sin signo y el byte de entrada es de 8 bits.

1. Poner el CRC a 0.
2. Obtener el siguiente byte del flujo de datos.

3. Comprobar el bit más significativo de CRC y el byte de entrada haciendo lo siguiente:

   Si son iguales, desplazar CRC a la izquierda 1.

   Si un bit es 0 y el otro 1, entonces desplazar CRC 1 a la izquierda y XOR con 4129.

4. Desplazar el byte de entrada a la izquierda 1.
5. Si no se ha desplazado el byte de entrada 8 veces, pasar al paso 3.
6. Si quedan bytes en el flujo de datos, ir al paso 2.

Puede encontrar una explicación teórica de este algoritmo en «Recetas numéricas en C: El arte de la computación científica».1 Press, William H., et al. Cambridge, MA: Cambridge University Press, 1992, 896-901.
A continuación, se presenta la función en C que calcula la CRC bit a bit:

    unsigned short CalculateCRC(char* buffer, int size)
    {
      unsigned short cword = 0;
      unsigned short ch;
      int i,j;
      for (i = 0; i < size; i++) {
        ch = buffer[i] << 8;
        for (j = 0; j < 8; j++) {
          if ((ch & 0x8000) ^ (cword & 0x8000)) {
            cword = (cword << 1) ^ 4129;
          }
          else {
            cword <<= 1;
          }
          ch <<= 1;
        }
      }
      return cword;
    }

El sistema de visión calcula la suma de comprobación de un archivo transferido a partir de los valores de caracteres ASCII del contenido del archivo codificado en hexadecimal. Por ejemplo:

Contenido de archivo | 0xAB 0xCD 0xEF 0x01
Representación en ASCII | ABCDEF01
Valores de bytes a comprobar | 0x41 0x42 0x43 0x44 0x45 0x46 0x30 0x31

Esta codificación para transferencias de archivos a través de comandos en modo nativo agrega una secuencia de un retorno de carro y un carácter de salto de línea cada 80 caracteres visibles.