CRC is the Cyclic Redundancy checksum (Cyclic)
Redundancy check): it is the most common error verification code in the field of data communication. It is characterized by the length of information fields and verification fields that can be selected at will.
In the field of data storage and data communication, the CRC verification utility library has to adopt the method of checking errors to ensure data correctness.
The following is the C language implementation of CRC32, which can be correctly run after testing:
/*************************************** * *************** Name: crc32.c ** Author: gzshun ** version: 1.0 ** Date: 2011-12 ** description: CRC32 checking ************************************** * ***************/# include <stdio. h> # include <stdlib. h> # include <string. h> # include <errno. h> # include <unistd. h> # include <fcntl. h> # include <sys/STAT. h> # define bufsize 1024*4 static unsigned int crc_table [256]; con St 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 \ n ", program_name);}/*** initialize the CRC table to generate a 32-bit CRC table. ** you can also define a CRC table and directly look up the table, ** however, there are a total of 256, which are dazzled by the generated ratio. Convenient. */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 ); elsec = C> 1;} crc_table [I] = C;}/* calculate the CRC check code of the buffer */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]) & 0 XFF] ^ (CRC> 8);} return CRC;}/*** calculate the CRC check code of a large file: The CRC32 function, which processes a buffer, ** however, if a file is relatively large, it cannot be directly read into the memory. ** therefore, you can only read the file in segments for CRC verification, ** the last CRC check code is passed to the new buffer check function cyclically. ** Finally, the generated CRC check code is the CRC check code of the file. (tested) */static int calc_img_crc (const char * in_file, unsigned int * img_crc) {int FD; int nread; int ret; unsigned char Buf [bufsize]; /* The first incoming value must be fixed. If the sender uses this value to calculate the CRC verification code, ** the receiver also needs to use this value for calculation */unsigned int CRC = 0 xffffffff; FD = Open (in_file, o_rdonly); If (FD <0) {printf ("% d: Open % S. \ n ", _ 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. \ n ", _ 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) {usag E (); 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 \ n", in_file, img_crc); Return 0 ;}/ *** test program ** environment: ** Linux Ubuntu 2.6.32-24-generic-pae # 39-ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux ** GCC version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ** gzshun @ Ubuntu :~ /Apue/CRC32 $ lscrc32.cgzshun @ Ubuntu :~ /Apue/CRC32 $ GCC crc32.c-O crc32gzshun @ Ubuntu :~ /Apue/CRC32 $./CRC32 crc32.cthe CRC of crc32.c is: 3892136086 */