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

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

CRC8テーブルの自動作成

2008年07月18日 09時40分00秒 | アルゴリズム関連

前回の記事でCRC8を計算する関数(GetCRC8)を紹介しました。
この関数は1バイトにつき8回計算を行うため低速です。
そこでテーブル参照で高速に計算できるようにするためのCRC8テーブルを自動作成します。(戻る)

CRCタイプ

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

サンプル

#include <stdio.h>
#include <limits.h>     // CHAR_BIT

// 記号定数
#define MSB_CRC8    (0x85)      // x8 + x7 + x2 + x0

// CRC8テーブルの初期化
static void InitCRC8Table( unsigned char table[256] )
{
    unsigned char value;
    
    for ( int n = 0 ; n < 256 ; n++ ){
        value = (unsigned char)(n << (8 - CHAR_BIT));   // value = n;
        
        for ( int i = 0 ; i < CHAR_BIT ; i++ ){
            if ( value & 0x80 ){
                value <<= 1; value ^= MSB_CRC8;
            }
            else{
                value <<= 1;
            }
        }
        table[ n ] = value;
    }
}

// CRC8テーブルの表示
static void ListCRC8Table( unsigned char table[256] )
{
    unsigned char *p = table;
    
    printf( "static unsigned char CRC8Table[ 256 ] = {\n" );
    for ( int k = 3 ; k >= 0 ; k-- ){
        for ( int j = 0 ; j < 8 ; j++ ){
            for ( int i = 0 ; i < 8 ; i++ ){
                printf( (i == 0) ? "\t" : " " );
                printf( "0x%02X,", *p++ );
            }
            printf( "\n" );
        }
        if ( k != 0 ) printf( "\t\n" );
    }
    printf( "};\n" );
}

// メイン関数
int main( void )
{
    unsigned char table[ 256 ];
    
    InitCRC8Table( table );
    ListCRC8Table( table );
    return 0;
}
  • そのまま実行すればコンソール画面にC/C++で利用できるソースを吐き出します。
  • ファイルにリダイレクトして保存してお使い下さい。(次の記事で使うので参照)

関連記事



コメント (1)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« CRC8の計算 | トップ | CRC8テーブルで計算 »
最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
お礼 (庄司)
2013-10-30 15:41:07
SMBusのCRC計算に困っていましたがお陰様で解決する事が出来ました。有難う御座います。
返信する

コメントを投稿

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