• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CRCの検定コードがどの文字でも同じになった!?)

CRCの検定コードが同じになる問題

このQ&Aのポイント
  • C言語の初級者が巡回符号方式(CRC)を使用した場合、伝送誤り検出のための検定コードを算出する課題に取り組んでいます。
  • しかし、プログラムを実行しても、検定コードがどの文字の場合でも同じになり、和も常に1530になってしまいます。
  • 問題の鍵は、検定コードが255(16進数ではFF)になることであり、これを解決するために何かアイデアはありますか?

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

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

うまくいきません。だけではなく、 必ず同じ結果になるということに 着目したのは、まず、OKとしま しょう。 「結果」というのは、直接的には、 crcReg[] の値です。 まず、crcReg[] の値を変化させて いる(または設定している)箇所を 全て抜き出します。 1) crcReg[s]=0xFFFF; 2) crcReg[s] = crcReg[s] >> 1; 3) crcReg[s] = (crcReg[s] ^ 0x8408); よく見ると、1) は、初期設定。 2) は、for(t = 0; t < 8; t++) の ループで毎回実行されますから、 トータルで、8ビット右シフトが発生し ここで、crcReg[] は、0x00ff に なっていることがわかります。 そうすると、3) は、「一度も実行 されていない」ことが推定できます。 ここまでが第一段階。 次に行きます。 3) が一度も実行されていないというこ とは、これを実行するための条件が 決して満足されないということです。 つまり、 if (flag == 0x01) が成立しない。 つまり、 flag = (crcReg[s] ^ jyuroku[s] & 0x01); が 0x01 にならない。 ということがわかります。 結論から言えば、ここが今回問題点です。 & と ^ は演算子の優先順位が異なります。 (& の優先順位が高い) 従って、この式は、意図しない順序で計算 されます。 この結果、flag の上位桁には、crcReg[] の (そもそも、0xffff で初期化された)値 がそのまま反映されてしまいます。 この結果、flga が 0x01 になることはない というのが今回の結果になります。 そうすれば、 flag = ((crcReg[s] ^ jyuroku[s]) & 0x01); とすれば少なくとも、「同じ結果」にはなら ないことがわかると思います。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

参考にしてください static Word crctable[256]; void MakeCrc(void) {   Word i;   Word j;   Word r;   for (i = 0; i < 256; i++) {     r = i;     for (j = 0; j < 8; j++)       if (r & 1)         r = (r >> 1) ^ 0x8408u;       else         r >>= 1;     crctable[i] = r;   } } Word GetCrcN(Byte *s, int len) {   Word r;   r = 0xFFFFu;   while (len--) {     r = (r >> 8) ^ crctable[(Byte)r ^ *s++];   }   return (r ^ 0xFFFFu); }

4253187b
質問者

お礼

とりあえずありがとうございます

すると、全ての回答が全文表示されます。