MotorolaHCS08マイクロコントローラーアプリケーションにCRC16エラー検出を追加しようとしています。ただし、私のチェックサムは一致しません。1つのオンラインCRC計算機は、PCプログラムで表示される結果とマイクロで表示される結果の両方を提供します。
マイクロの結果を「XModem」、PCの結果を「カーミット」と呼びます。
これらの2つの古いプロトコルがCRC16の使用を指定する方法の違いは何ですか?
MotorolaHCS08マイクロコントローラーアプリケーションにCRC16エラー検出を追加しようとしています。ただし、私のチェックサムは一致しません。1つのオンラインCRC計算機は、PCプログラムで表示される結果とマイクロで表示される結果の両方を提供します。
マイクロの結果を「XModem」、PCの結果を「カーミット」と呼びます。
これらの2つの古いプロトコルがCRC16の使用を指定する方法の違いは何ですか?
同じ基本的なコード ベースを使用して、16 ビットの IBM、CCITT、XModem、Kermit、および CCITT 1D0F を実装できます。http://www.acooke.org/cute/16bitCRCAl0.htmlを参照してください。これは、 http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Codeのコードを使用しています
次の表は、それらの違いを示しています。
name polynomial initial val reverse byte? reverse result? swap result?
CCITT 1021 ffff no no no
XModem 1021 0000 no no no
Kermit 1021 0000 yes yes yes
CCITT 1D0F 1021 1d0f no no no
IBM 8005 0000 yes yes no
ここで、「リバース バイト」は、各バイトが処理前にビット反転されることを意味します。「reverse result」は、16 ビットの結果が処理後にビット反転されることを意味します。「スワップ結果」は、結果の 2 バイトが処理後にスワップされることを意味します。
上記のすべては、 http: //www.lammertbies.nl/comm/info/crc-calculation.html に対するテスト ベクトルで検証されました(それが間違っている場合、私たちはすべて失われます...)。
したがって、特定のケースでは、各バイトをビット反転し、最終結果をビット反転し、結果の 2 バイトを交換することで、XModem のコードを Kermit に変換できます。
[私は、各バイトを逆にすることは多項式を逆にすることと同等であると信じていますが、詳細を確認したり調べたりしていません(さらにいくつかの詳細)。これが、基本的に同じアルゴリズムであるにもかかわらず、さまざまな場所で非常に異なる説明が表示される理由です。
また、上記のアプローチは効率的ではありませんが、テストには適しています。効率的にしたい場合は、上記をルックアップテーブルに変換するのが最善の方法です.]
上記で私が CCITT と呼んでいるものを編集すると、 RevEng カタログに CCITT-FALSE として記載されています。詳細については、上記のリンクにある私のブログ投稿の更新を参照してください。
私の記憶(私は昔、モデム関連の作業を行っていました)は、Kermitがデータの各バイトのビットを最下位ビットを最初に使用して処理することです。
ほとんどのソフトウェアCRC実装(おそらくXmodem)は、データバイトの最上位ビットを最初に実行します。
リンクしたCRC計算ページに使用されているライブラリソース(http://www.lammertbies.nl/comm/software/index.htmlからダウンロード)を見ると、XModemがCRC16-CCITTを使用していることがわかります。多項式は次のとおりです。
x^16 + x^12 + x^5 + 1 /* the '^' character here represents exponentition, not xor */
多項式はビットマップで表されます(ビット16が暗示されていることに注意してください)
0x1021 == 0001 0000 0010 0001 binary
Kermitの実装では以下を使用します。
0x8408 == 1000 0100 0000 1000 binary
これはXModemと同じビットマップですが、逆になっているだけです。
ライブラリに付属するテキストファイルには、カーミットの次の違いも記載されています。
CRC-KermitおよびCRC-SICKの場合のみ:すべての入力処理の後、CRCの1の補数が計算され、CRCの2バイトが交換されます。
したがって、PCの結果に一致するようにCRCルーチンを変更するのはおそらく簡単なはずです。CRCライブラリのソースはかなりリベラルなライセンスを持っているように見えることに注意してください-多かれ少なかれそのまま使用するのが理にかなっているかもしれません(少なくともアプリケーションに適用される部分)。