[背景]
現在、CRC32(反転)の演算・複合(受信時チェック)の実装に挑戦しています。
以下のgetCrc32()に文字列"123456789"を入力値として演算し、
CRC値を計算すると「0xcbf43926」が取得できます。
この結果は、いくつかのネット上の演算器の結果と一致しており、
正しい値であると認識しております。
CRC演算器(※一例)
http://lazesoftware.com/tool/hash/
次に、受信側でこの「0xcbf43926」を付与したデータを入力として、
再度同じgetCrc32()を使用し、以下添付のソースコードの実装にて、
CRC値を計算した結果が「0」とならず、結果、受信NGと判定してしまいます。
※ただし、CRC32(標準):「0x04C11DB7」でも同じ手順を行い確認しましたが、
結果は「0」となり、正しい値であることは確認できました。
[質問事項]
そこで、以下についてご教授をお願いできませんでしょうか。
1.CRC32(反転)においても、「入力データ+CRC32値(①)」に対して、
①を算出した際の同じ演算を行うと「0」になる認識に誤りはありませんでしょうか。
2.受信時のチェック方法の認識が誤っている場合、正しいチェック方法をご教授いただけませんでしょうか。
参考HP等をご紹介いただけると助かります。
C
1■CRCデータ 受信チェック 2 data[0] = 0x31; //ASCII文字 入力データStart 3 data[1] = 0x32; 4 data[2] = 0x33; 5 data[3] = 0x34; 6 data[4] = 0x35; 7 data[5] = 0x36; 8 data[6] = 0x37; 9 data[7] = 0x38; 10 data[8] = 0x39; //ASCII文字 入力データEnd 11 data[9] = 0xcb; //CRC32(反転)値 Start 12 data[10] = 0xf4; 13 data[11] = 0x39; 14 data[12] = 0x26;//CRC32(反転)値 End 15 crc=0xFFFFFFFF; //初期値 16 for (i = 0; i<13; i++) { 17 crc = getCrc32(crc, data[i]); 18 } 19 ret = ~crc; //入力データを最後まで入れたためbit反転してCRC値を確定 20 21 ★CRC値付きのデータを入力としているため、retが0になることを期待★ 22 23■CRCデータ 計算関数 24/* 1byte単位のCRC32計算 25unsigned long getCrc32(unsigned long regist, unsigned char targetData) 26{ 27 unsigned char i_cnt; 28 unsigned char crcProc; /* CRC計算実施フラグ */ 29 30 for(i_cnt = 0; i_cnt < 8; i_cnt++) 31 { 32 if((targetData >> i_cnt) & 1) 33 { 34 regist ^= 1; 35 } 36 crcProc = (regist & 1); 37 regist >>= 1; 38 /* registから溢れが発生したら生成多項式とのXORを実施 */ 39 if(1 == crcProc) 40 { 41 regist ^= 0xEDB88320U; 42 } 43 } 44 return regist; 45} 46 47
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/24 04:02