CRC32校正演算法-C實現

來源:互聯網
上載者:User

CRC即迴圈冗餘校正碼(Cyclic
Redundancy Check):是資料通訊領域中最常用的一種差錯校正碼,其特徵是資訊欄位和校正欄位的長度可以任意選定。

CRC校正公用程式庫在資料存放區和資料通訊領域,為了保證資料的正確,就不得不採用檢錯的手段。

以下是CRC32的C語言實現,經過測試,能夠正確運行:



/******************************************************* 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*4static 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\n", 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);elsec = 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.\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) {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\n", in_file, img_crc);return 0;}/***測試程式**環境:**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*/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.