周期冗長検査 (CRC: Cyclical Redundancy Check)
ネイティブモードのファイル転送コマンドでは、標準の 16 ビットの周期冗長検査 (CRC: Cyclical Redundancy Check) チェックサムが使用されます。 CRC を計算するアルゴリズムが続きます。 この例の変数 CRC は符号なしの 16 ビットで、入力バイトは 8 ビットです。
- CRC を 0 に設定します。
- 次のバイトをデータストリームから取得します。
- CRC の最上位ビットと入力バイトをテストし、以下を実行します。
- これらが同等である場合は、CRC を 1 つ左にずらします。
- 1 つのビットが 0 でもう一方が 1 の場合、CRC を 1 つ左にずらし、XOR を 4129 で計算します。
- 入力バイトを 1 つ左にずらします。
- 入力バイトを 8 回ずらさなかった場合は、ステップ 3 に進みます。
- データストリームにバイトが残っている場合は、ステップ 2 に進みます。
このアルゴリズムの理論的説明については、『Numerical Recipes in C:The Art of Scientific Computing』1
一度に 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;
}