周期冗長検査 (CRC: Cyclical Redundancy Check)

ネイティブモードのファイル転送コマンドでは、標準の 16 ビットの周期冗長検査 (CRC: Cyclical Redundancy Check) チェックサムが使用されます。  CRC を計算するアルゴリズムが続きます。  この例の変数 CRC は符号なしの 16 ビットで、入力バイトは 8 ビットです。

  1. CRC を 0 に設定します。
  2. 次のバイトをデータストリームから取得します。
  3. CRC の最上位ビットと入力バイトをテストし、以下を実行します。
    1. これらが同等である場合は、CRC を 1 つ左にずらします。
    2. 1 つのビットが 0 でもう一方が 1 の場合、CRC を 1 つ左にずらし、XOR を 4129 で計算します。
  4. 入力バイトを 1 つ左にずらします。
  5. 入力バイトを 8 回ずらさなかった場合は、ステップ 3 に進みます。
  6. データストリームにバイトが残っている場合は、ステップ 2 に進みます。

このアルゴリズムの理論的説明については、『Numerical Recipes in C:The Art of Scientific Computing1
一度に CRC の 1 ビットを計算する C 関数は次のようになります。

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

}