• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CRC8 ATMの計算方法)

CRC8 ATMの計算方法

このQ&Aのポイント
  • CRC8 ATMの計算方法について、初期値とツールの結果の一致に関して質問があります。
  • CRC8 ATMの計算方法を詳しく解説したサイトが見つからず、生成多項式で割って余りを求める方法しか分かりません。
  • 与えられたデータの下位に初期値を付加し、生成多項式で割って余りを求めることでCRCを計算しますが、初期値が0x00の場合と0xFFの場合でツールの結果が一致しない問題が発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>最上位ビットが1なら多項式とXORと言うのはデータを多項式で割った時の余りを求めるという事なので理解できたのですが、 それだけでは不十分です。 「1ビットシフトして、最上位ビットが1になったら多項式とXOR」と言うのが「剰余計算と同等」になります。 なので、元データが4バイトなら、4バイト×8ビットで、32回シフトする事になります。 >質問にも書きましたがCRCの初期値の処理の仕方について解説しているサイトが見つからず初期値を入力データのMSBから8ビットとXORすると言うのがよく理解できませんでした。 実際にプログラムしてみると判りますが 00010010001101000101011001111000 00000000 初期値と元データの8ビットをXOR と 01111110 001101000101011001111000 ↓元データの次の8ビットとXOR 01001010 や 11110001 0101011001111000 ↓元データの次の8ビットとXOR 10100111 は「まったく同一の処理」になります。 要は「元データの現在位置の8ビットと、今の8ビットサイズの作業用レジスタを、XORする」ですから。 >また、入力データをそのまま多項式で割って余りを求め場合は24回シフトになると思うんのですが回答では32回シフトしていますが、これはCRCの初期値に関係なくデータの下位に0x00を付加してから多項式で余りを求めると言う事でしょうか? 違います。 「1ビットシフトして、最上位ビットが1になったら多項式とXOR」と言うのが「剰余計算と同等」になりますから、シフトの回数は「元データのビット数と同じ」になります。 元データが4バイト(32ビット)なら、32回シフトします。 で、肝心の「CRCの初期値」ですが「初期値が何になっているかで、結果が256通りに変わる」と言う意味しかありません(CRC8は8ビットなので、2の8乗、つまり256通りの解が得られる) 初期値0x00でCRC計算した物は、初期値0x00でCRCチェックした物と一致します(他の値で、偶然に一致してしまう確率は、1/256しかない) 初期値0x00でCRC計算した物は、初期値0x01でCRCチェックした物とは一致しません。 なので「CRC値を生成した、データの送信元」と「データを受け取ってCRC検査をする受信先」で「初期値を同じ値にしておく必要」があります。 言ってみれば「合言葉を同じにしておく必要がある」のです。 同じ多項式、同じアルゴリズム、同じプログラムを用いた同士であっても「初期値が食い違っていると、CRCエラーになる」のです。 「初期値が食い違っている」のであれば、ほぼ間違いなく「データの宛先を間違えた」って事です。 初期値が食い違ったままCRCチェックを行えば、ほぼ間違いなく(255/256の確率で)「CRCエラー」になります。 「初期値」は、このように「送信元と受信先のペアが正しいかどうか」の意味しか持ちません。 送信元と受信先で「同じ初期値を使っている」のであれば「初期値を何にしたって構わない」のです。 0x00にするのも、0xffにするのも、0xaaにするのも、0x55にするのも、どれも「同じ意味」なのです。

A-MASAK
質問者

お礼

詳しい解説ありがとうございます。 大変参考になりました。

その他の回答 (1)

回答No.1

根本から間違っています。 初期値0x00の場合 00010010001101000101011001111000 00000000 初期値と元データの8ビットをXOR ↓ 00010010 ↓左送り1 00100100 ↓左送り2 01001000 ↓左送り3 10010000 ←最上位ビットが1なら ↓左送り4して 00100000 00000111 ↓多項式とXOR 00100111 ↓左送り5して 01001110 ↓左送り6 10011100 ←最上位ビットが1なら ↓左送り7して 00111000 00000111 ↓多項式とXOR 00111111 ↓左送り8 01111110 001101000101011001111000 ↓元データの次の8ビットとXOR 01001010 ↓左送り1 10010100 ←最上位ビットが1なら ↓左送り2して 00101000 00000111 ↓多項式とXOR 00101111 ↓左送り3 01011110 ↓左送り4 10111100 ←最上位ビットが1なら ↓左送り5して 01111000 00000111 ↓多項式とXOR 01111111 ↓左送り6 11111110 ←最上位ビットが1なら ↓左送り7して 11111100 00000111 ↓多項式とXOR 11111011 ←最上位ビットが1なら ↓左送り8して 11110110 00000111 ↓多項式とXOR 11110001 0101011001111000 ↓元データの次の8ビットとXOR 10100111 ←最上位ビットが1なら ↓左送り1して 01001110 00000111 ↓多項式とXOR 01001001 ↓左送り2 10010010 ←最上位ビットが1なら ↓左送り3して 00100100 00000111 ↓多項式とXOR 00100011 ↓左送り4 01000110 ↓左送り5 10001100 ←最上位ビットが1なら ↓左送り6して 00011000 00000111 ↓多項式とXOR 00011111 ↓左送り7 00111110 ↓左送り8 01111100 01111000 ↓元データの次の8ビットとXOR 00000100 ↓左送り1 00001000 ↓左送り2 00010000 ↓左送り3 00100000 ↓左送り4 01000000 ↓左送り5 10000000 ←最上位ビットが1なら ↓左送り6して 00000000 00000111 ↓多項式とXOR 00000111 ↓左送り7 00001110 ↓左送り8 00011100 生成されたCRC値00011100(0x1C 初期値0xFFの場合 00010010001101000101011001111000 11111111 初期値と元データの8ビットをXOR ↓ 11101101 以下、初期値が0x00の時と同じように演算すると(説明略、結果のみ表記) 11101101(0xED 11011101(0xDD 10111101(0xBD 01111101(0x7D 11111010(0xFA 11110111(0xF3 11100001(0xE1 11000101(0xC5 10001101(0x8D 10111001(0xB9 01110101(0x75 11101010(0xEA 11010011(0xD3 10100001(0xA1 01000101(0x45 10001010(0x8A 00010011(0x13 00100110(0x26 01110000(0x70 11100000(0xE0 11000111(0xC7 10001001(0x89 00010101(0x15 00101010(0x2A 01010100(0x54 10101000(0xA8 01010111(0x57 00101111(0x2F 01011110(0x5E 10111100(0xBC 01111111(0x7F 11111110(0xFE 11111011(0xFB 11110001(0xF1 11100101(0xE5 11001101(0xCD 生成されたCRC値11001101(0xCD となります。 因みに「生成されたCRC値の妥当性」は「元データの末尾に生成したCRC値を付加して、改めてCRC計算する」事で確かめられます。 初期値0x00の場合 00010010001101000101011001111000 ←元データ 00011100 ←求まるCRC値 0001001000110100010101100111100000011100 ←CRC値を付加したデータ 00000000 ←これで求まるCRC値 初期値0xFFの場合 00010010001101000101011001111000 ←元データ 11001101 ←求まるCRC値 0001001000110100010101100111100011001101 ←CRC値を付加したデータ 00000000 ←これで求まるCRC値 このように「求めたCRC値を付加して再計算」すると「必ず0x00になる」という法則があります。

A-MASAK
質問者

補足

詳しい回答ありがとうございます。 回答の通り計算すると確かにツールと一致しました。 『与えられたデータの下位 (ビット送りの反対側) に「初期値」を付加する』と言うのは誤回答だったのですね(ベストアンサーに選ばれていたりしますが。。。)。 最上位ビットが1なら多項式とXORと言うのはデータを多項式で割った時の余りを求めるという事なので理解できたのですが、質問にも書きましたがCRCの初期値の処理の仕方について解説しているサイトが見つからず初期値を入力データのMSBから8ビットとXORすると言うのがよく理解できませんでした。 また、入力データをそのまま多項式で割って余りを求め場合は24回シフトになると思うんのですが回答では32回シフトしていますが、これはCRCの初期値に関係なくデータの下位に0x00を付加してから多項式で余りを求めると言う事でしょうか?

関連するQ&A

専門家に質問してみよう