CRC16のプログラムを作ったのでデバッグしていて気付いた事なのですが
(産業装置で使うMODBUS-RTUのソフト)
CRC16 x16+x15+x2+1
生成多項式 0xA001
CRC16でCRCを含めたデータを再CRCするとゼロになると言われておりますが
そうならないのですが何故でしょう?
もちろん、自分の作ったソフトが信用できないので他ソフトで検証
具体例
ベクターにあるCRC16の計算ソフト - CRC16.exe
http://blog.goo.ne.jp/masaki_goo_2006/e/50b20edb …
これに文字列"ABCD" [0x4142,0x4344]を入れて計算実行
出力結果
初期値:0xFFFF、出力XOR:0xFFFF、出力結果、右送り0x0F85
この出力を最初の文字列に追加する
0x4142,0x4344,0x0F85
結果は0xc7e6 となってゼロになりません
やりかたが違うのでしょうか?
尚、私の作ったプログラムと上記ソフトの結果が同じです
また、ネット上にある同様な他ソフトでも同じ結果でした
(もちろんCRC計算条件が同じ物)
尚、上記ソフトで
初期値:0x0000、出力XOR:0x0000、左送り:9AA8
この場合のみCRC追加しての再CRCはゼロになりました
ゼロになる場合とならない場合があるのでしょうか?
No.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 にできるんですけど, どうでしょうか?
ご回答有難う御座います
要するに、
>「CRCが付いたデータをCRCするとゼロになる」
必ずしもそうなるとは限らない
と、結論付けて良いわけですね
言い換えれば
「再CRCがゼロになるには、それなりの条件が要る」
もしくは
「都市伝説に過ぎない」
本件ではmodbusプロトコルでのCRC16なので
当方でCRCの条件は変更できません
「再CRCはゼロになりません」
と、結論がでればそれで良いので
有難う御座いました
No.1
- 回答日時:
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を比較する
と、解釈できるのですが
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
夏が終わったと感じる瞬間って、どんな時?
まだまだ暑い今日この頃。 しかしながら、もう夏は終わっている!……はず。 あなたが思う「夏が終わった!」エピソードを教えてください。
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
【お題】 ・世界最古のコンビニについて知ってる事を教えてください
-
架空の映画のネタバレレビュー
映画のCMを見ていると、やたら感動している人が興奮で感想を話していますよね。 思わずストーリーが気になってしまう架空の感動レビューを教えて下さい!
-
C# シリアル通信でデータ受信時の欠損について
C言語・C++・C#
-
CRCの計算方法について
C言語・C++・C#
-
CRCのアルゴリズムって、どんな計算するんですか?
その他(インターネット接続・インフラ)
-
-
4
16進の10進変換について
Visual Basic(VBA)
-
5
Visual Basic でのコードをASCII変換、16進変換したものを元に戻す方法を教えてください
Visual Basic(VBA)
-
6
CRCの計算に関する質問です。
計算機科学
-
7
RS485について
その他(コンピューター・テクノロジー)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
COBOLのMOVEで桁数が異なる場合
-
cout と cerrの違い
-
プログラムについての質問です...
-
4Kの外部モニターに出力すると...
-
VBAのExecメソッドで画面を非表...
-
javacoreの見方について
-
CRC16計算について
-
VBAでテキスト出力時のスペース...
-
coutで出力した文字を消去する...
-
テキストファイルから特定の文...
-
ListViewの複数選択について
-
printfとputcharの違いは
-
アクセスでエクセルに出力する...
-
標準出力の上書き
-
VSC++でDLL出力でのデバックビルド
-
MMDでavi出力が出来ない
-
エクセルで英字と数字を組み合...
-
CStringとCByteArrayの変換
-
【エクセル、並び替えについて】
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
MMDでavi出力が出来ない
-
プログラムについての質問です...
-
コンセントの電力は入力と出力...
-
cout と cerrの違い
-
COBOLのMOVEで桁数が異なる場合
-
VBAのExecメソッドで画面を非表...
-
アクセスでエクセルに出力する...
-
Windows Formアプリからコンソ...
-
VBAでテキスト出力時のスペース...
-
coutで出力した文字を消去する...
-
Accessのテーブルからcsv出力す...
-
スマホのバッテリー消費につい...
-
ACCESS クエリ→フォーム...
-
テキストファイルから特定の文...
-
ACCESSからExcelへエクスポート...
-
無線とかアンテナに関しの質問...
-
CRC16計算について
-
printfとputcharの違いは
おすすめ情報