- ベストアンサー
CRC16計算の仕組みと再CRCに関する疑問
- CRC16計算のプログラムを使ってデータを再CRCする際、ゼロにならない理由について疑問があります。
- 私が作成したプログラムと他のソフトウェアで同じ結果が出るため、計算条件が同じであることは確認済みです。
- ただし、特定の初期値や出力XOR値を使用する場合にはゼロになることがありますが、その理由は不明です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
すみません, 忘れてました. CRC を計算するときには 1. 与えられたデータの下位 (ビット送りの反対側) に「初期値」を付加する 2. 生成多項式で割って余りを求める 3. 「出力XOR」との排他的論理和を計算する という手順をとります. つまり, 「初期値:0x0000、出力XOR:0x0000、左送り:9AA8」 は (以下 16進で表記します) 1. データ列 41 42 43 44 に初期値 0000 を付加して 41 42 43 44 00 00 を得る 2. それを生成多項式で割って余り 9AA8 を得る 3. それと出力XOR 0000 との排他的論理和を計算して 9AA8 を求める として得られた値です. で, 「CRCを含めたデータを再CRCする」というのはこの場合 データ列 41 42 43 44 9A A8 に対して CRC を計算する 言い替えれば「データ列 41 42 43 44 に対し 9A A8 を初期値として CRC を求める」ということです (初期値の設定ができないので, 質問文に挙がっている CRC16.exe ではこのような計算はできません). 最後にある 「尚、上記ソフトで 初期値:0x0000、出力XOR:0x0000、左送り:9AA8 この場合のみCRC追加しての再CRCはゼロになりました」 はおそらく 41 42 43 44 9A A8 というデータを入力した結果だと思いますが, それは実際には 41 42 43 44 9A A8 00 00 に対して CRC を計算しています (41 42 43 44 9A A8 に対して CRC が 0 になるならこれに対しても 0 になるけど, それは「CRC が想定しているチェック方法」ではない). ここまでは初期値 0000, 出力XOR 0000 なので簡単ですが, その他の値を使った場合には得られた CRC を「適切に」変化させた値を初期値にしないと「CRCを含めたデータを再CRCするとゼロになる」などという都合のいいことにはなりません. ところで, 初期値と出力XOR が両方とも 0 なら右送りでも (左送りと同じ事情で) 最終的な CRC を 0 にできるんですけど, どうでしょうか?
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
CRC か.... 懐かしいなぁ.... それはまさしく「やりかたが違う」から. 「CRC を使って検証する」というのは, 単に「元dのデータに CRC を追加して改めて CRC を計算する」ってことじゃない. ちなみにいうと「この場合のみCRC追加しての再CRCはゼロになりました」ってところも (CRC の理屈からは当然そうなるけど) 「正しい検証方法」ではないよ.
お礼
ご回答有難う御座います > (CRC の理屈からは当然そうなるけど) 「正しい検証方法」ではないよ. アチコチのサイトでCRCに付いて調べてみました 「CRCが付いたデータをCRCするとゼロになる」 と、言う説しか見つかりません 「必ずしもゼロになるとは限りません」 と書かれたサイトや文献は見つかりません 素人が自分で作ったソフトなら単純にバグで終わりなのですが 専門家の方々が作ったソフトでゼロにならないのは何故? と、言うのが本質問の趣旨です 「modobusプロトコルで使ってるCRC-16はゼロに成りません」 と、言う公式文書が見つかれば安心できるのですが 例えば国産modobus機器メーカのマニュアルとかで modobus協会のサイトは英文だし google翻訳だけではちょっと怪しいし http://www.modbus.org/tech.php 自分なりに妖しいまでもプロトコルマニュアルと格闘して 受信電文中のCRCと受信電文から計算したCRCを比較する と、解釈できるのですが
お礼
ご回答有難う御座います 要するに、 >「CRCが付いたデータをCRCするとゼロになる」 必ずしもそうなるとは限らない と、結論付けて良いわけですね 言い換えれば 「再CRCがゼロになるには、それなりの条件が要る」 もしくは 「都市伝説に過ぎない」 本件ではmodbusプロトコルでのCRC16なので 当方でCRCの条件は変更できません 「再CRCはゼロになりません」 と、結論がでればそれで良いので 有難う御座いました