CRCの検定コードがどの文字でも同じになった!?
C言語の初級者が質問します。
講義の課題で、「伝送誤り検出方式として巡回符号方式(CRC:Cyclic Redundancy Check)を使用した場合、送り側でアルファベット6文字の適当な単語を1文字ずつ入力した場合の検定コードを算出しなさい。生成多項式はCRC-16-CCITT(Xの16乗)+(Xの12乗)+(Xの5乗)+1を使用し、検定コードは2byteとする。
この課題に対し、一文字ずつ、検定コードを求めて合計6個の和を出して16進数で表現しようと考え、以下のプログラムを作りました。#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main ()
{
int t,s,i,m;
int l;
int flag;
int crcReg[10]; // crcRegは一文字ごとのCRCの計算途中過程 res[]は一文字ごとのCRCの最終結果
char inData[6]; //文字列入力
int jyuroku[6];
int crcmax;
printf("文字入力(6文字まで):");
gets(inData); //
l=strlen(inData);
for(i = 0;i < l; i++) {
printf("%d番目は16進数で%X\n",i+1,inData[i]); //
}
printf("各文字の16進asciiは(0x必要か?)");
for(m = 0;m <l;m++) {
printf("%d番目のascii:",m+1);
scanf("%X", &jyuroku[m]); //
}
//**********************************(後半)**********************************************
for(s=0;s < l; s++) {//文字の数だけ繰り返し
crcReg[s]=0xFFFF; //CRCの初期値はどの文字の場合でも同じ
printf("%d 番目の16進ascii:%X\n",s+1,jyuroku[s]); //
for (t = 0;t < 8; t++) { //入力する16進数は8ビット=1バイト ゆえ8回繰り返し
flag = (crcReg[s] ^ jyuroku[s] & 0x01); // 生成多項式をかけるかどうかの判定の前段階
crcReg[s] = crcReg[s] >> 1; //CRCの計算過程を1ビット右にシフト
if (flag == 0x01) { //最下位ビットflagが1の時の処理
crcReg[s] = (crcReg[s] ^ 0x8408); //生成多項式は10進数で
}
else if (flag == 0x00) {
}
jyuroku[s] = jyuroku[s] >> 1; // asciiコードも1 ビットシフト
}
printf("CRCの結果は%X\n",crcReg[s]); //
}
crcmax = crcReg[0]+crcReg[1]+crcReg[2]+crcReg[3]+crcReg[4]+crcReg[5];
printf("\n kekka:%d",crcmax); //
return 0; //
}
しかし、こうするとcrcReg[s](検定コード)がどの文字の場合でも同じ255(16進数ではFF)になって、6文字の単語は常に和が1530になってしまいます。255=16の2乗-1であることが問題解決の鍵だと思うのですが、何か問題点わかりますか?
補足
一応そこも考慮したうえでそのような計算結果になると思うのですが 1.データ1バイト取得0000 0001 2.1回目 データ:0000 0001 , CRC16:0000 0000 桁上がりなし 3.1回目 データ:0000 0010 , CRC16:0000 0000 桁上がりなし 以降7回目まではデータ部分のみ移動が起きるだけで桁上がりは無し 2.8回目 データ:1000 0000 , CRC16:0000 0000 桁上がりなし 3.8回目 データ:(1) 0000 0000 桁上がりあり CRC16:0000 0000と0000 0001のxorをとる CRC16:0000 0001になる こうなるのではないのでしょうか? またビット反転とのことですが 1111 1110となってもやはり答えとは違うと思うのですが… どこか未だ私に認識違いがあるようです。 引き続きよろしくお願いします。