サイクル冗長検査CRC 32のC言語実装
2780 ワード
CRC即ち循環冗長検査コード(Cyclic Redundancy Check):データ通信分野で最もよく用いられる誤り検査コードであり、情報フィールドと検査フィールドの長さを任意に選択できることを特徴とする.CRC検証ユーティリティライブラリは,データ格納やデータ通信の分野において,データの正確さを保証するために,誤り検出の手段を用いざるを得ない.
以下はCRC 32のC言語実装で、テストを経て、正しく動作します.
crc32.c
実行結果(例):#./crc32 ./crc32.c The crc of ./crc32.c is:2456832695
変換元:http://www.linuxidc.com/Linux/2011-12/49710.htm
以下はCRC 32のC言語実装で、テストを経て、正しく動作します.
crc32.c
#include
#include
#include
#include
#define BUFSIZE 1024*4
static unsigned int crc_table[256];
const static char * program_name = "crc32";
static void usage(void);
static void init_crc_table(void);
static unsigned int crc32(unsigned int crc, unsigned char * buffer, unsigned int size);
static int calc_img_crc(const char * in_file, unsigned int * img_crc);
static void usage(void)
{
fprintf(stderr, "Usage: %s input_file
", program_name);
}
/*
* crc , 32 crc
* crc , ,
* 256 , , .
*/
static void init_crc_table(void)
{
unsigned int c;
unsigned int i, j;
for (i = 0; i < 256; i++)
{
c = (unsigned int)i;
for (j = 0; j < 8; j++)
{
if (c & 1)
c = 0xedb88320L ^ (c >> 1);
else
c = c >> 1;
}
crc_table[i] = c;
}
}
/* buffer crc */
static unsigned int crc32(unsigned int crc,unsigned char *buffer, unsigned int size)
{
unsigned int i;
for (i = 0; i < size; i++)
{
crc = crc_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);
}
return crc ;
}
/*
* CRC :crc32 , buffer ,
* ,
* crc ,
* crc buffer ,
* , crc crc .( )
*/
static int calc_img_crc(const char *in_file, unsigned int *img_crc)
{
int fd;
int nread;
int ret;
unsigned char buf[BUFSIZE];
/* , crc , */
unsigned int crc = 0xffffffff;
fd = open(in_file, O_RDONLY);
if (fd < 0)
{
printf("%d:open %s.
", __LINE__, strerror(errno));
return -1;
}
while ((nread = read(fd, buf, BUFSIZE)) > 0)
{
crc = crc32(crc, buf, nread);
}
*img_crc = crc;
close(fd);
if (nread < 0)
{
printf("%d:read %s.
", __LINE__, strerror(errno));
return -1;
}
return 0;
}
int main(int argc, char **argv)
{
int ret;
unsigned int img_crc;
const char *in_file = argv[1];
if (argc < 2)
{
usage();
exit(1);
}
init_crc_table();
ret = calc_img_crc(in_file, &img_crc);
if (ret < 0)
{
exit(1);
}
printf("The crc of %s is:%u
", in_file, img_crc);
return 0;
}
実行結果(例):#./crc32 ./crc32.c The crc of ./crc32.c is:2456832695
変換元:http://www.linuxidc.com/Linux/2011-12/49710.htm