前回の記事でCRC8を計算する関数(GetCRC8)を紹介しました。
この関数は1バイトにつき8回計算を行うため低速です。
そこでテーブル参照で高速に計算できるようにするためのCRC8テーブルを自動作成します。(戻る)
CRCタイプ
- CRCタイプ(CRC8)
- 生成多項式(0x85)⇒x8 + x7 + x2 + x0
- 初期値(0x00)
- 出力XOR(0x00)
- 入力ビット逆転(なし)
- 出力ビット逆転(なし)
- ビット送り(左送り)
サンプル
#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++で利用できるソースを吐き出します。
- ファイルにリダイレクトして保存してお使い下さい。(次の記事で使うので参照)
関連記事
- CRC8の計算
- CRC8テーブルの自動作成
- CRC8テーブルで計算
- CRC16テーブルで計算(CRC-CCITT)
- CRC32テーブルで計算
- ファイルのCRC32の計算
- MD2/MD4/MD5ハッシュの計算(128ビット)
- ファイルのMD2/MD4/MD5ハッシュの計算(128ビット)