1. 程式人生 > >CRC32校驗原理及實現

CRC32校驗原理及實現

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

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

CRC碼校驗原理:

傳送端:傳送端根據資訊欄位與生成多項式生產呢個CRC碼,CRC碼作為資料傳送給接收端,同時也會把計算出的校驗欄位的資料一同傳送(注:目的是如果接受端檢測到傳送的資料是正確的,接收端能夠從CRC碼中提取出資訊欄位的資料)。

接收端:接收到CRC碼資料後,檢測接收到的資料是否正確,方法:將CRC碼資料與生成多項式進行模2除,如果餘數為0,則說明接收到的資料是正確的。然後,從CRC碼中提取出資訊欄位的資料。

實現方法:

1、傳送端生成CRC碼方法:

CRC碼是由兩部分組成的,前部分是資訊欄位,就是需要校驗的資訊,後部分是校驗欄位,如果CRC碼共長n個bit,資訊欄位長k個bit,就稱為(n,k)碼。它的編碼規則是:

  • 首先將資訊欄位值(k bit)左移r位(k+r=n)
  • 運用一個生成多項式g(x) (也可看成二進位制數) 模2除上面的式子,得到的餘數就是校驗欄位值。
  • 生成的CRC碼值為:資訊欄位值+校驗欄位值(單位:位bit,次序:高位到低位),例如欄位值為1001,校驗欄位值為110,則CRC碼為1001110
2、接收端驗證過程:略; 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*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\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);
			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.\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)
**
[email protected]
:~/apue/crc32$ ls crc32.c [email protected]:~/apue/crc32$ gcc crc32.c -o crc32 g[email protected]:~/apue/crc32$ ./crc32 crc32.c The crc of crc32.c is:3892136086 */


相關推薦

CRC32原理實現

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

CRC16原理實現

CRC碼由傳送端計算,放置於傳送資訊報文的尾部。接收資訊的裝置再重新計算接收到資訊報文的CRC,比較計算得到的CRC是否與接收到的相符,如果兩者不相符,則表明出錯。 校驗碼的計算多項式為(X16 + X15 + X2 + 1)。具體CRC16碼的計算方法是:

[技術棧]CRC原理C#程式碼實現CRC16、CRC32計算FCS

1.CRC、FCS是什麼 CRC,全稱Cyclic Redundancy Check,中文名稱為迴圈冗餘校驗,是一種根據網路資料包或計算機檔案等資料產生簡短固定位數校驗碼的一種通道編碼技術,主要用來檢測或校驗資料傳輸或者儲存後可能出現的錯誤。它是利用除法及餘數的原理來作錯誤偵測的。 FCS,全稱Frame C

CRC的原理硬體、軟體演算法實現

轉自:http://blog.163.com/yucheng_xiao/blog/static/76600192201393092918776/  一、基本原理     CRC檢驗原理實際上就是在一個p位二進位制資料序列之後附加一個r位二進位制檢驗碼(序列),從而構成一個總長為n=p+r位的二進位制序

MODBUS CRC原理C語言實現

MODBUS通訊協議的CRC校驗原理多項式為8005的逆序A001列01的CRC校驗原理:1111111111111111                 初始化CRC寄存機0000000000000

CRC原理步驟

ext 是把 nsf 其它 結果 aci 發送 二進制 padding 什麽是CRC校驗? CRC即循環冗余校驗碼:是數據通信領域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環冗余檢查(CRC)是一種數據傳輸檢錯功能,對數據進行多項式計算,並將

CRC原理步驟(轉載只是為了查閱方便,若侵權立刪)

什麼是CRC校驗? CRC即迴圈冗餘校驗碼:是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊欄位和校驗欄位的長度可以任意選定。迴圈冗餘檢查(CRC)是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。 &n

CRC演算法實現 C

 標準CRC生成多項式如下表:   名稱       生成多項式             簡記式*  標準引用    CRC-4       x4+x+1                  3         ITU G.704    CRC-8       x8+x5+x

CRC原理STM32 IAP線上升級程式

CRC校驗原理: 什麼是CRC校驗? CRC即迴圈冗餘校驗碼:是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊欄位和校驗欄位的長度可以任意選定。迴圈冗餘檢查(CRC)是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,

CRC碼計算原理的最通俗詮釋

5.3.2 迴圈冗餘校驗檢錯方案       奇偶校驗碼(PCC)只能校驗一位錯誤,本節所要介紹的迴圈冗餘校驗碼(CRC)的檢錯能力更強,可以檢出多位錯誤。        1. CRC校驗原理    &nb

java 實現CRC32

https://blog.csdn.net/yjk2515279130/article/details/46045939 實現了CRC32校驗,本來java那邊是很簡單的,直接用  java.util.zip.CRC32 這個類就可以了,可是如果要和Delphi那裡

crc32的c語言實現

最近在做軟體升級,需要對升級檔案進行crc校驗,就學習了crc的實現原理 crc就是一個數值,該數值用於檢驗資料的正確性,crc校驗的原理就是將需要作校驗的資料與一個數據模2相除,得到的餘數即為校驗值。       模2相除就是在除的過程中用模2加,模2加實際上就是異或

CRC原理和verilog實現方法(一)

1.CRC簡介  CRC全稱迴圈冗餘校驗(Cyclic Redundancy Check, CRC),是通訊領域資料傳輸技術中常用的檢錯方法,用於保證資料傳輸的可靠性。網上有關這方面的部落格和資料很多,本文儘量簡潔的梳理一下它的原理。後面還會結合自己的實踐經驗(不多),說一說如何使用verilog語

關於base64編碼的原理實現

一個 replace 編碼範圍 func nco 都是 style bit 如果 我們的圖片大部分都是可以轉換成base64編碼的data:image。 這個在將canvas保存為img的時候尤其有用。雖然除ie外,大部分現代瀏覽器都已經支持原生的基於base64的enco

java設計模式singleton原理實現

最新 不必要 -- 不同 適合 所有 引用 ati cnblogs 題外話:我要變強,要變強,變強,強。 1、 Singleton的應用場景以及為什麽要使用singleSingleton是一生只能有一個實例的對象。只能由singleton自身創建一個實例。外人是無法創建實例

Jquery Validate 默認規則常用的自定義驗證規則

字符 eth ber exp string amp 手機 zip 子郵件 Jquery Validate 相關參數及常用的自定義驗證規則 一、官網地址:http://bassistance.de/jquery-plugins/jquery-plugin-validatio

決策樹原理實現

方式 -1 變化 log nbsp 導致 結點 以及 重要 1、決策樹原理 1.1、定義 分類決策樹模型是一種描述對實例進行分類的樹形結構。決策樹由結點和有向邊組成。結點有兩種類型:內部節點和葉節點,內部節點表示一個特征或屬性,葉節點表示一個類。

RPC原理實現

.get 版本 pcs 連接方式 正常 zookeepe list 接口 分布式計算 1 簡介 RPC 的主要功能目標是讓構建分布式計算(應用)更容易,在提供強大的遠程調用能力時不損失本地調用的語義簡潔性。為實現該目標,RPC 框架需提供一種透明調用機制讓使用者不必顯式的

SSO單點登錄原理實現

response dem nbsp boolean 配置文件 實現 有效 ucc ons 1.SSO分類   根據實現的域不同,可以把SSO分為同域SSO、同父域SSO、跨域SSO三種類型。 2.SSO實現原理 a.打開統一的登錄界面 b.登錄,同時向服務器寫入Cookie

線程池的原理實現

execute inter void date() 超過 緩沖 線程池大小 exceptio 調整 1、線程池簡介: 多線程技術主要解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力。 假設一個服務器完成一項任務所需時間為:T1