プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

CRC8の計算

2008年07月17日 15時16分00秒 | アルゴリズム関連

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タイプ

  1. CRCタイプ(CRC8)
  2. 生成多項式(0x85)
  3. 初期値(0x00)
  4. 出力XOR(0x00)
  5. 入力ビット逆転(なし)
  6. 出力ビット逆転(なし)
  7. ビット送り(左送り)

サンプル

#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桁と文字列が標準出力に表示されます。

関連記事



コメント (3)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« プロセスのメモリ・ページ情... | トップ | CRC8テーブルの自動作成 »
最新の画像もっと見る

3 コメント

コメント日が  古い順  |   新しい順
ビット送り 左送り->右送り (ひで)
2011-04-26 16:51:45
CRC8の計算
大変参考になりました。
上記のコーディングはビット送りが左送りですが、これを右送りにするにはどうすればよろしいのしょうか?

返信する
Re:ビット送り 左送り->右送り (ブログ管理人)
2011-04-28 00:49:26
> 上記のコーディングはビット送りが左送りですが、これを右送りにするにはどうすればよろしいのしょうか?
下のリンクは「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に対応できますよ。
分かりましたか?
返信する
参考になりました (7of9)
2018-08-01 13:55:50
参考になりました。
ありがとうございます。

こちらを参考にCRC-8-CCITTを実装しました。
https://qiita.com/7of9/items/267c85c889a7add31f7e
返信する

コメントを投稿

アルゴリズム関連」カテゴリの最新記事