# 本机模式校验和

本机模式文件传输命令使用的校验和是标准的 16 位循环冗余校验 (CRC)。计算 CRC 的算法如下。在本例中，变量 CRC 是无符号的 16 位，输入字节是 8 位。

1. 将 CRC 设置为 0。
2. 从数据流中获取下一个字节。

3. 测试 CRC 的最高有效位和输入字节并执行以下操作：

   如果它们相等，则将 CRC 左移 1。

   如果一个位为 0 而另一个位为 1，则将 CRC 左移 1 并与 4129 异或。

4. 将输入字节左移 1。
5. 如果您没有将输入字节移位 8 次，请转至步骤 3。
6. 如果数据流中有剩余字节，请转到步骤 2。

有关该算法的理论解释，您可以参阅以下书籍：C:The Art of Scientific Computing.1 Press, William H., et al. Cambridge, MA:Cambridge University Press, 1992, 896-901.
C 函数一次一个位地如下计算 CRC：

    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;
    }

视觉系统根据十六进制编码文件内容的 ASCII 字符值计算所传输文件的校验和。例如：

文件内容 | 0xAB 0xCD 0xEF 0x01
ASCII 表示 | ABCDEF01
要校验的字节值 | 0x41 0x42 0x43 0x44 0x45 0x46 0x30 0x31

这种对通过本机模式命令进行文件传输的编码会在每 80 个可见字符后添加一个回车符和一个换行符序列。