【注意】
本内容は、最近CRCについて調べた人間の浅い知識が記載されています。文中説明に間違いがあるかもしれません。ご容赦ください。
◎まえがき
CRCの覚書その1ではCRC16左送りについて、その動作に触れた。
某T社が採用しているCCITT CRC16の右送りにも携わる機会があったので、その2でまとめておく。
単純に左送りを右送りにしただけではない。
◎CRC16右送りの計算方法
生成多項式は、左送りと違い
8408h
を用いる。
動作イメージを説明するとCCITT CRC16の右送りは、まずはじめに、16ビットの計算部に任意初期値をセットし8ビットのデータ部に任意長データの最初の1バイトをセットする。
①計算部とデータ部のLSBをXORする。
②結果が
False(0)なら、計算部を右1ビットシフトする。
True(1)なら、計算部を右1ビットシフトした後に生成多項式8408hをXORする。
③データ部を右1ビットシフトして、データ8ビット分終了するまで①へ戻る。
④次のデータをデータ部へセットする。
下表は、計算例として初期値3791hにて、データ0B22をCRC16の右送りにて計算するはじめの部分である。
16ビットの計算部に初期値3791hをセット。
データ部に0Bhをセットし、LSBをXORする。
結果がFalseなので、
計算部を右1ビットシフトし
データ部を右1ビットシフトする。
計算部とデータ部のLSBをXORする。
結果がTrueなので、
計算部を右1ビットシフトし生成多項式8408hをXORする。
データ部を右1ビットシフトする。
計算部とデータ部のLSBをXORする。
結果がFalseなので...
これをデータ8ビット分繰り返す。
上記処理をデータ0B22について実行すると結果がA301hとなる。
結果の上位下位バイトをスワップし01A3hとして、
37910B2201A3(初期値+データ+結果(バイトスワップ))
として送信することで、受信側は上記CRC-16右送り計算を行うと結果がゼロになり、送られてきたデータに誤りが無いことが確認できる。
EXCELファイルで検証したものは こちら