迴圈冗餘校驗 CRC32 的 C 語言實現

2021-06-19 22:09:51 字數 1747 閱讀 7326

crc即迴圈冗餘校驗碼(cyclic redundancy check):是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。crc校驗實用程式庫在資料儲存和資料通訊領域,為了保證資料的正確,就不得不採用檢錯的手段。

下面是crc32的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)

/* * 初始化crc表,生成32位大小的crc表

* 也可以直接定義出crc表,直接查表,

* 但總共有256個,看著眼花,用生成的比較方便.

*/

static void init_crc_table(void)

crc_table[i] = c;

} } /* 計算buffer的crc校驗碼 */

static unsigned int crc32(unsigned int crc,unsigned char *buffer, unsigned int size)

return crc ;

} /*

* 計算大檔案的crc校驗碼:crc32函式,是對乙個buffer進行處理,

* 但如果乙個檔案相對較大,顯然不能直接讀取到記憶體當中

* 所以只能將檔案分段讀取出來進行crc校驗,

* 然後迴圈將上一次的crc校驗碼再傳遞給新的buffer校驗函式,

* 到最後,生成的crc校驗碼就是該檔案的crc校驗碼.(經過測試)

*/

static int calc_img_crc(const char *in_file, unsigned int *img_crc)

while ((nread = read(fd, buf, bufsize)) > 0)

*img_crc = crc;

close(fd);

if (nread < 0)

return 0;

} int main(int argc, char **argv)

init_crc_table();

ret = calc_img_crc(in_file, &img_crc);

if (ret < 0)

printf("the crc of %s is:%u\n", in_file, img_crc);

return 0;

}

執行結果(舉例):

# ./crc32 ./crc32.c

the crc of ./crc32.c is:2456832695

**:

CRC32 迴圈冗餘校驗 演算法的簡單介紹

crc校驗實用程式庫 在資料儲存和資料通訊領域,為了保證資料的正確,就不得不採用檢錯的手段。在諸多檢錯手段中,crc是最著名的一種。crc的全稱是迴圈冗餘校驗,其特點是 檢錯能力極強,開銷小,易於用編碼器及檢測電路實現。從其檢錯能力來看,它所不能發現的錯誤的機率僅為0.0047 以下。從效能上和開銷...

CRC32校驗 c實現

環境 vs2013 成功編譯並執行 include include include pragma warning disable 4996 這樣防止警告 dword crc32table 256 0x04 c1 1d b7 dword bitreverse dword poly 進行位顛倒 retu...

迴圈冗餘校驗 CRC校驗

一 crc校驗概念 即迴圈冗餘校驗碼 cyclic redundancy check 是資料通訊領域中最常用的一種查錯校驗碼,迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。其特徵是資訊字段和...