2010-12-15 13 views
7

私はMotorola HCS08マイクロコントローラアプリケーションにCRC16エラー検出を追加しようとしています。私のチェックサムは一致しません。 1つのonline CRC calculatorは私が私のPCプログラムで見る結果と私がマイクロで見る結果の両方を提供します。CRC16チェックサム:HCS08対Kermit対XMODEM

これは、マイクロの結果 "XModem"とPCの結果 "Kermit"を呼び出します。

2つの古代のプロトコルがCRC16の使用を指定する方法の違いは何ですか?

答えて

17

同じ基本コードベースを使用して、16ビットIBM、CCITT、XModem、Kermit、およびCCITT 1D0Fを実装できます。次の表は、それらがどのように異なるかを示しhttp://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code

からコードを使用するhttp://www.acooke.org/cute/16bitCRCAl0.html参照:

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 

「逆バイトが」各バイトが処理する前にビット反転であることを意味します。 「逆の結果」は、処理後に16ビットの結果がビット反転されることを意味する。 'スワップ結果'は、結果の2バイトが処理後にスワップされることを意味します。

上記のすべてがhttp://www.lammertbies.nl/comm/info/crc-calculation.htmlに対するテストベクタで検証されています(それが間違っていると、すべてが失われています...)。

したがって、特定のケースでは、各バイトをビット反転して最終結果を反転し、結果の2バイトをスワップすることによって、XModemのコードをKermitに変換できます。

[私は信じていますが、詳細をチェックしたり解読したりしていないので、各バイトを逆にすることは多項式を逆転させることに相当します。基本的に同じアルゴリズムなので、さまざまな場所で非常に異なる説明が表示されます。

上記の方法も効率的ではありませんが、テストには適しています。あなたが効率的かどう行うための最善のことは、上記のルックアップ・テーブルを翻訳している。]

編集私は上記CCITT-FALSEとしてRevEng catalogueに記載されてCCITTと呼ばれているもの。詳細については、上のリンクの私のブログポストへの更新を参照してください。

+0

優れた研究! – Potatoswatter

+0

あなたのリンクには、上記の情報に基づいてルックアップテーブルを生成することができます。それはどうやってできますか?また、フレーズ "逆"を使用している方法と、この記事で使用している方法との間には何らかの相関関係がありますか? http://www.danielvik.com/2010/10/calculating-reverse-crc.html彼はすべてルックアップテーブルのアプローチで実装されているので、もしあれば違い/共通点を見るのに苦労しています。ありがとう。 – NickHalden

+0

@NickHalden NO - その記事は、非常に奇妙なことをしています。これはあなたが望むものである可能性は非常に低いです。 CRCが何らかの価値をもって出てくるように、何にテキストを追加すべきかを計算しています。 //上記のコードを使用してルックアップテーブルを生成し、同じロジックがループ内の値0〜255に適用されるように書き直してから、それらの値を保存して後で "内部ループ"の代わりに使用しますcrcアルゴリズム –

4

私の思い出し(私は以前モデムをやっていましたが)は、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 

カーミットの実装で使用することによって表される。

0x8408 == 1000 0100 0000 1000 binary 

これはXModemのものと同じビットマップで、逆しかありません。

ライブラリはまた、カーミットのため、以下の違いに言及付属のテキストファイル:のみCRC-カーミットとCRC-SICKため

:すべての入力処理の後、CRCの1の補数を計算しているが2バイトのCRCが入れ替えられます。

したがって、PCの結果と一致するようにCRCルーチンを変更するのは簡単でしょう。 CRCライブラリのソースにはかなり自由なライセンスがあるように見えますが、それは多かれ少なかれ(少なくともアプリケーションに適用される部分)を使用するのが理にかなっています。

+0

これはその90%です。さらに、そのコードを見ると、CCITTメソッドはチェックサム内のバイトをスワップします。実際にPCのプログラムがLabViewに入っているので、チェックサムアルゴリズムが実際に何かを確認するのは簡単ではありませんでした。解決策は、CCITTとして自分自身を宣伝し、その結果と一致させるためにマイクロからバイトを任意に逆にする別のCRCライブラリを取得することでした。 – Potatoswatter

+0

CRC-KermitとCRC-SICKのためにCRCの補数を実行することに関するテキストファイルの注釈は、「コピーミス」と思われます。同じテキストファイルには、CRC-DNPのための上記の注釈があります。これは、必要な補数演算(「コピーミス」理論をサポートしています)を説明しています。ソースコードの検査は、補数演算がCRC-DNPにのみ適用され、CRC-KermitおよびCRC-SICKには適用されないことを確認するように見える。 –

関連する問題