此 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編譯調試,并與電腦輸出進行對比:
通過以上對比,可見輸出結果與電腦一緻。
接下來,我們進行修改 初始值,驗證算法是否正确,将初始值改為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;
}
進行測試:
再接下來,我們修改 多項式,進一步驗證算法的正确性:
将多項式由 Y= X^4 + 1 改為 Y = X^4 + X + 1;
即為:由 0x01 改為 0x03【注意上述代碼需要兩處都進行修改】。進行測試:
可見結果一緻。