☆☆☆☆☆☆☆☆☆CRCの覚書その2”右送り”☆☆☆☆☆☆☆☆☆


【注意】
本内容は、最近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ファイルで検証したものは こちら


HOME