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で質問しましょう!
似たような質問が見つかりました
- メルカリ メルカリでMovement in motion 腕時計 MIM-CRC-SSが新品未使用で7000円 1 2022/07/29 08:42
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- 日用品・生活雑貨 シチズンの電波ソーラーウオッチ未使用でmim-crc-ss/nvは定価が33000円です。未使用です 2 2022/08/01 16:23
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- 会計ソフト・業務用ソフト 会計ソフトを探してます。 4 2022/08/17 08:35
- 工学 【呉工業製品についての工学的な質問です】ギアの小歯車に呉工業のグリスメイトを吹き掛けた 2 2023/03/12 14:23
- 化学 【呉工業のCURE CRC ドライファストルブ】のドライは乾燥、ファストは速いで、速乾 2 2023/08/01 19:44
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
CRC-CCITTに関しての仕様とサンプルソフトを教えて下さい。
C言語・C++・C#
-
CRCの計算に関する質問です。
計算機科学
-
CRCのアルゴリズムって、どんな計算するんですか?
その他(インターネット接続・インフラ)
-
-
4
teratrermを使ったデータの送信について
Windows 10
-
5
CRCの計算方法について
C言語・C++・C#
-
6
RS485について
その他(コンピューター・テクノロジー)
-
7
セル列のすべての文字列の頭に”0x”を追加したい
その他(Microsoft Office)
-
8
Array配列の末尾に追加したい。
Visual Basic(VBA)
-
9
「消費電力」と「消費電流」について
その他(パソコン・周辺機器)
-
10
16進の10進変換について
Visual Basic(VBA)
-
11
照度の単位変換
物理学
-
12
「&HFFFF」「&H1A」とは?
Visual Basic(VBA)
-
13
double型の値をchar配列に変換する方法はありますか?
C言語・C++・C#
-
14
Tera Term Proに関する質問です。
その他(コンピューター・テクノロジー)
-
15
COMポート 名前を取得する方法
C言語・C++・C#
-
16
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
17
2台のPCでRS-232C接続でファイル転送
その他(コンピューター・テクノロジー)
-
18
VB2010 COMポートからのバイナリ受信
Visual Basic(VBA)
-
19
CRCが一致する確率
その他(プログラミング・Web制作)
-
20
なぜ通信には16進数文字列が使われるのでしょうか シリアル通信や、xbeeなど、通信には16進数文字
ネットワーク
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
コンセントの電力は入力と出力...
-
スマホのバッテリー消費につい...
-
VBAでテキスト出力時のスペース...
-
4Kの外部モニターに出力すると...
-
cout と cerrの違い
-
MMDでavi出力が出来ない
-
COBOLのMOVEで桁数が異なる場合
-
CrystalReportの文字列の折返し...
-
標準出力の上書き
-
エクセルで英字と数字を組み合...
-
PS5をMacBookProに出力したいの...
-
【VC#】Windowsアプリケーショ...
-
【UNIX】echoコマンドのタブが...
-
ACCESS クエリ→フォーム...
-
VBAのExecメソッドで画面を非表...
-
KEYENCEのシーケンスプログラム...
-
OBS配信すると、マイクが途切れ...
-
アクセスでエクセルに出力する...
-
VBAで有効数字の設定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
最近の画像生成AIについて。 長...
-
Excel VBAで値を変えながら、pd...
-
コンセントの電力は入力と出力...
-
MMDでavi出力が出来ない
-
OBS配信すると、マイクが途切れ...
-
4Kの外部モニターに出力すると...
-
Windows11対応の3入力1出力 USB...
-
VBAでテキスト出力時のスペース...
-
COBOLのMOVEで桁数が異なる場合
-
テキストファイルから特定の文...
-
cout と cerrの違い
-
CRC16計算について
-
Windows Formアプリからコンソ...
-
NTTのホームゲートウェイとOCN...
-
VBAのExecメソッドで画面を非表...
-
VBAで有効数字の設定
-
アクセスでエクセルに出力する...
-
printfとputcharの違いは
-
無線とかアンテナに関しの質問...
おすすめ情報