天天看點

CRC-4檢驗代碼

此 CRC校驗的多項式為 0x01,即為: Y= X^4 + 1;

初始值為 0x0A;

經過參考CRC-8的代碼,進行了相應的修改。(CRC-8 代碼如下連結:CRC校驗詳解(附代碼示例))

下面為進行調試的代碼:

#include <stdio.h>

unsigned char test_buf[4] = {0xD0,0x8A,0x65,0x50};
unsigned char test_res = 0;

unsigned char CalcCRC4 (unsigned char *data,unsigned int Length )
{
    unsigned char i;
	unsigned char j;
	unsigned char data_1;
	unsigned char data_2;
    unsigned char Init = 0x0A; //初始值
	
	while(Length > 0)
	{
		data_1 = *data++;
		data_2 = data_1;
		Init = (Init & 0x0F) ^ (data_1 >> 4); //一個位元組資料的高4位與crc初始值低4位異或
		for(i = 0; i < 4; i++)                //循環4位
		{
			if(Init & 0x08)                   //左移移出的位為1,左移後與多項式異或
				Init = (((Init & 0x0F) << 1) ^ 0x01); 
			 else
				Init <<= 1;        //否則直接左移
		}
		Init = (Init & 0x0F) ^ (data_2 & 0x0F);//一個位元組資料的低4位與crc初始值低4位異或
		for(j = 0; j < 4; j++)
		{
			if(Init & 0x08)
				Init = (((Init & 0x0F) << 1) ^ 0x01);
			 else
				Init <<= 1;
		}
		Length--;
	}
    return (Init & 0x0F);                           

}


int main(void)
{	
	printf( "Input number is: %x,%x,%x,%x \n",test_buf[0],test_buf[1],test_buf[2],test_buf[3]);
	test_res = CalcCRC4(test_buf,4);
	printf( "CRC res is: %x",test_res);
	
	return 0;
}



           

接下來進行 gcc編譯調試,并與電腦輸出進行對比:

CRC-4檢驗代碼
CRC-4檢驗代碼
CRC-4檢驗代碼
CRC-4檢驗代碼

通過以上對比,可見輸出結果與電腦一緻。

接下來,我們進行修改 初始值,驗證算法是否正确,将初始值改為0x00,代碼片段如下:

#include <stdio.h>

unsigned char test_buf[4] = {0xD0,0x8A,0x65,0x50};
unsigned char test_res = 0;

unsigned char CalcCRC4 (unsigned char *data,unsigned int Length )
{
    unsigned char i;
	unsigned char j;
	unsigned char data_1;
	unsigned char data_2;
    unsigned char Init = 0x00; //初始值
	
	while(Length > 0)
	{
		data_1 = *data++;
		data_2 = data_1;
		Init = (Init & 0x0F) ^ (data_1 >> 4); //一個位元組資料的高4位與crc初始值低4位異或
		for(i = 0; i < 4; i++)                //循環4位
		{
			if(Init & 0x08)                   //左移移出的位為1,左移後與多項式異或
				Init = (((Init & 0x0F) << 1) ^ 0x01); // 多項式為 0x01 
			 else
				Init <<= 1;      //否則直接左移
		}
		Init = (Init & 0x0F) ^ (data_2 & 0x0F);//一個位元組資料的低4位與crc初始值低4位異或
		for(j = 0; j < 4; j++)
		{
			if(Init & 0x08)
				Init = (((Init & 0x0F) << 1) ^ 0x01); // 多項式為 0x01
			 else
				Init <<= 1;
		}
		Length--;
	}
    return (Init & 0x0F);                           

}


int main(void)
{	
	printf( "Input number is: %x,%x,%x,%x \n",test_buf[0],test_buf[1],test_buf[2],test_buf[3]);
	test_res = CalcCRC4(test_buf,4);
	printf( "CRC res is: %x",test_res);
	
	return 0;
}




           

進行測試:

CRC-4檢驗代碼
CRC-4檢驗代碼

再接下來,我們修改 多項式,進一步驗證算法的正确性:

将多項式由 Y= X^4 + 1 改為 Y = X^4 + X + 1;

即為:由 0x01 改為 0x03【注意上述代碼需要兩處都進行修改】。進行測試:

CRC-4檢驗代碼
CRC-4檢驗代碼

可見結果一緻。

繼續閱讀