回答編集履歴

1 +=補足

IchigoTaruto

IchigoTaruto score 139

2017/01/24 12:47  投稿

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る