CRCとは巡回冗長検査(じゅんかい・じょうちょう・けんさ)という誤りを検出する方法の1つです。
その他ハッシュ・キーを計算するハッシュ関数としても使うことが出来かも。無理かも。好みで。(戻る)
今回のCRCは8ビット幅で生成多項式に X8 + X7 + X2 + 1 を利用します。
この生成多項式は CRC8 の1つです。他にも下のような種類があります。
- CRC8 (X8 + X7 + X6 + X4 + X2 + 1)
- CRC8-CCITT (X8 + X7 + X3 + X2 + 1)
- CRC8-SAE J1850 (X8 + X4 + X3 + X2 + 1)
- CRC8-ATM (X8 + X2 + X1 + 1)
- CRC8-Dallas/Maxim (X8 + X5 + X4 + 1)
CRCタイプ
- CRCタイプ(CRC8)
- 生成多項式(0x85)
- 初期値(0x00)
- 出力XOR(0x00)
- 入力ビット逆転(なし)
- 出力ビット逆転(なし)
- ビット送り(左送り)
サンプル
#include <stdio.h> #include <string.h> #include <limits.h> // CHAR_BIT // 記号定数 #define MSB_CRC8 (0x85) // x8 + x7 + x2 + x0 // CRC8の計算(生成多項式:0x85,左送り) static unsigned char GetCRC8( const void *buff, size_t size ) { unsigned char *p = (unsigned char *)buff; unsigned char crc8; for ( crc8 = 0x00 ; size != 0 ; size-- ){ crc8 ^= *p++; for ( int i = 0 ; i < CHAR_BIT ; i++ ){ if ( crc8 & 0x80 ){ crc8 <<= 1; crc8 ^= MSB_CRC8; } else{ crc8 <<= 1; } } } return crc8; } // メイン関数 int main( void ) { char buff[ 1024 ]; char *find; while ( fgets(buff,sizeof(buff),stdin) != NULL ){ if ( (find = strchr(buff,'\n')) != NULL ){ *find = '\0'; } printf( "0x%02X %s\n", GetCRC8(buff,strlen(buff)), buff ); } return 0; }
- 文字列を入力します。
- またはパイプやリダイレクションを利用して入力させます。
- 出力は8ビットの16進2桁と文字列が標準出力に表示されます。
関連記事
- CRC8の計算
- CRC8テーブルの自動作成
- CRC8テーブルで計算
- CRC16テーブルで計算(CRC-CCITT)
- CRC32テーブルで計算
- ファイルのCRC32の計算
- MD2/MD4/MD5ハッシュの計算(128ビット)
- ファイルのMD2/MD4/MD5ハッシュの計算(128ビット)
大変参考になりました。
上記のコーディングはビット送りが左送りですが、これを右送りにするにはどうすればよろしいのしょうか?
下のリンクは「CRC16テーブルで計算」を紹介してます。
http://blog.goo.ne.jp/masaki_goo_2006/e/a826604d8954db71505f3467080315f3
↑
この記事のコメントを参考にして下さい。
Vectorさんに『アルゴリズム辞典』の全Cソースがダウンロード可能です。
これをダウンロードして『crc16.c』や『crc16t.c』を参照してみて下さい。
http://www.vector.co.jp/soft/data/prog/se002453.html
ダウンロードしたら「CRC16の右送り」ソースをCRC8に対応させるのです。
方法か簡単でforループを16回行う場所を8回にするだけです。
私の記事では「for ( int i = 0 ; i < CHAR_BIT ; i++ )」となってる部分が、
CRC16では「16」とか、「CHAR_BIT * 2」とかなってるはずです。
ここを8回ループするように修正すればCRC8に対応できますよ。
分かりましたか?
ありがとうございます。
こちらを参考にCRC-8-CCITTを実装しました。
https://qiita.com/7of9/items/267c85c889a7add31f7e