|
|
教學(xué)公告
CRC(cyclical redundancy check) 循環(huán)冗余校驗(yàn),在《計(jì)算機(jī)組成原理》里面有這個(gè)知識(shí)點(diǎn),。類(lèi)似的校驗(yàn)有奇偶校驗(yàn),、校驗(yàn)和校驗(yàn)。
可以簡(jiǎn)單的理解成在發(fā)送數(shù)據(jù)后面加上這個(gè)驗(yàn)證碼,,判斷前面數(shù)據(jù)是否正確,。
接收方如何檢查收到的信息有無(wú)錯(cuò)誤(一個(gè)簡(jiǎn)單通俗的模型) 首先接收方和發(fā)送方約定一個(gè)“生成多項(xiàng)式”g(x);
生成多項(xiàng)式的選取是個(gè)很有難度的問(wèn)題,,如果選的不好,,那么檢出錯(cuò)誤的概率就會(huì)低很多。好在這個(gè)問(wèn)題已經(jīng)被專家們研究了很長(zhǎng)一段時(shí)間了,,對(duì)于我們這些使用者來(lái)說(shuō),,只要把現(xiàn)成的成果拿來(lái)用就行了。在本次課程上,,我們寫(xiě)一個(gè)簡(jiǎn)單的程序來(lái)生成CRC碼,,然后做驗(yàn)證。
模板:
#include
#include
#include
#include
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
/************************************************************************/
/* 產(chǎn)生CRC16多項(xiàng)式(0x1021)的校驗(yàn)碼(只能處理單個(gè)字節(jié))
/************************************************************************/
void crc16_one_byte(const uchar data, ushort &crc)
{
}
/************************************************************************/
/* 產(chǎn)生CRC32多項(xiàng)式(0x04C11DB7)的校驗(yàn)碼(只能處理單個(gè)字節(jié))
/************************************************************************/
void crc32_one_byte(const uchar data, uint &crc )
{
}
/************************************************************************/
/* 產(chǎn)生CRC16多項(xiàng)式(0x1021)的校驗(yàn)碼(能處理多個(gè)字節(jié))
/* CRC32類(lèi)似
/************************************************************************/
void crc16_multi_byte(const uchar data, ushort &crc)
{
}
/************************************************************************/
/* 得到發(fā)送的數(shù)據(jù)
/* 對(duì)應(yīng)于CRC16校驗(yàn),CRC32類(lèi)似
/************************************************************************/
void getSendData(const uchar data, char *sendData, ushort &crc16)
{
}
/************************************************************************/
/* 驗(yàn)證接收到的數(shù)據(jù)
/* 對(duì)應(yīng)于CRC16校驗(yàn),CRC32類(lèi)似
/************************************************************************/
void checkout_data(char *sendData)
{
}
int main( void )
{
char sendData[10] = {0};
uchar data = 'a';
ushort crc16 = 0;
//得到CRC16的校驗(yàn)碼
crc16_one_byte(data, 8, crc16);
//拼接得到需要發(fā)送的數(shù)據(jù)
getSendData(data, sendData, crc16);
//驗(yàn)證數(shù)據(jù)
checkout_data(sendData);
return 0;
}