質問: crcProc) { regist ^= 0xEDB88320U; } } return regist; } ```
回答: // crcを熟知しているわけではないので、こういうことではないかという推測なのですが... crcが0になるというのは、 「カウンタ(regist)にカウンタと同じビット列を入力すれば、xorしているところ(regist ^= 1;)が必ず0になるから、カウンタサイズ分回せば、カウンタが0になる」 ということだと思います。 なので、ご提示のコードの場合最後に反転しているので0にすることは出来ませんがffffffffには出来ると思います。 また、カウンタを右へシフトし、入力バイトを下位ビットから読み取っているので、crcのバイトオーダーを逆順にする必要があります。 ``` data[9] = 0xcb; //CRC32(反転)値 Start data[10] = 0xf4; data[11] = 0x39; data[12] = 0x26;//CRC32(反転)値 End ``` の部分を ``` data[12] = 0xcb ^ 0xff; //CRC32(反転)値 Start data[11] = 0xf4 ^ 0xff; data[10] = 0x39 ^ 0xff; data[9] = 0x26 ^ 0xff; //CRC32(反転)値 End ``` にして実行すれば、retはffffffffになるはずです。 といいますか、 ``` ret = ~crc; //入力データを最後まで入れたためbit反転してCRC値を確定 ``` をコメントアウトして、crcのバイトオーダーを逆順にすれば、 期待通りcrc=0になるのではないでしょうか。