?? crc.c
字號:
/******************************************************************************
* 源程序文件名: crc.c *
* 功能: 循環冗余碼校驗模塊 *
* 說明: 循環冗余碼校驗為16位,使用CRC-16生成多項式 *
******************************************************************************/
/******************************************************************************
* CRC校驗的工作原理 *
* CRC校驗方法是將要發送的數據比特序列當作一個多項式f(x)的系數,在發送方用收發 *
* 雙方預先約定的生成多項式G(x)去除,求得一個余數多項式.將余數多項式加到數據多 *
* 項式之后發送到接收端.接收端用同樣的生成多項式G(x)去除接收數據多項式f(x),得 *
* 到計算余數多項式.如果計算余數多項式與接收余數多項式相同,則表示傳輸無差錯; *
* 如果計算余數多項式不等于接收余數多項式,則表示傳輸有差錯,由發送方重發數據, *
* 直到正確為止 *
******************************************************************************/
# include "crc.h"
/* CRC16 = X16+X15+X5+1 */
static const unsigned short _crc1608_0xA001_[256] = {
0X0000,0XC0C1,0XC181,0X0140,0XC301,0X03C0,0X0280,0XC241,
0XC601,0X06C0,0X0780,0XC741,0X0500,0XC5C1,0XC481,0X0440, // 0
0XCC01,0X0CC0,0X0D80,0XCD41,0X0F00,0XCFC1,0XCE81,0X0E40,
0X0A00,0XCAC1,0XCB81,0X0B40,0XC901,0X09C0,0X0880,0XC841, // 1
0XD801,0X18C0,0X1980,0XD941,0X1B00,0XDBC1,0XDA81,0X1A40,
0X1E00,0XDEC1,0XDF81,0X1F40,0XDD01,0X1DC0,0X1C80,0XDC41, // 2
0X1400,0XD4C1,0XD581,0X1540,0XD701,0X17C0,0X1680,0XD641,
0XD201,0X12C0,0X1380,0XD341,0X1100,0XD1C1,0XD081,0X1040, // 3
0XF001,0X30C0,0X3180,0XF141,0X3300,0XF3C1,0XF281,0X3240,
0X3600,0XF6C1,0XF781,0X3740,0XF501,0X35C0,0X3480,0XF441, // 4
0X3C00,0XFCC1,0XFD81,0X3D40,0XFF01,0X3FC0,0X3E80,0XFE41,
0XFA01,0X3AC0,0X3B80,0XFB41,0X3900,0XF9C1,0XF881,0X3840, // 5
0X2800,0XE8C1,0XE981,0X2940,0XEB01,0X2BC0,0X2A80,0XEA41,
0XEE01,0X2EC0,0X2F80,0XEF41,0X2D00,0XEDC1,0XEC81,0X2C40, // 6
0XE401,0X24C0,0X2580,0XE541,0X2700,0XE7C1,0XE681,0X2640,
0X2200,0XE2C1,0XE381,0X2340,0XE101,0X21C0,0X2080,0XE041, // 7
0XA001,0X60C0,0X6180,0XA141,0X6300,0XA3C1,0XA281,0X6240,
0X6600,0XA6C1,0XA781,0X6740,0XA501,0X65C0,0X6480,0XA441, // 8
0X6C00,0XACC1,0XAD81,0X6D40,0XAF01,0X6FC0,0X6E80,0XAE41,
0XAA01,0X6AC0,0X6B80,0XAB41,0X6900,0XA9C1,0XA881,0X6840, // 9
0X7800,0XB8C1,0XB981,0X7940,0XBB01,0X7BC0,0X7A80,0XBA41,
0XBE01,0X7EC0,0X7F80,0XBF41,0X7D00,0XBDC1,0XBC81,0X7C40, // A
0XB401,0X74C0,0X7580,0XB541,0X7700,0XB7C1,0XB681,0X7640,
0X7200,0XB2C1,0XB381,0X7340,0XB101,0X71C0,0X7080,0XB041, // B
0X5000,0X90C1,0X9181,0X5140,0X9301,0X53C0,0X5280,0X9241,
0X9601,0X56C0,0X5780,0X9741,0X5500,0X95C1,0X9481,0X5440, // C
0X9C01,0X5CC0,0X5D80,0X9D41,0X5F00,0X9FC1,0X9E81,0X5E40,
0X5A00,0X9AC1,0X9B81,0X5B40,0X9901,0X59C0,0X5880,0X9841, // D
0X8801,0X48C0,0X4980,0X8941,0X4B00,0X8BC1,0X8A81,0X4A40,
0X4E00,0X8EC1,0X8F81,0X4F40,0X8D01,0X4DC0,0X4C80,0X8C41, // E
0X4400,0X84C1,0X8581,0X4540,0X8701,0X47C0,0X4680,0X8641,
0X8201,0X42C0,0X4380,0X8341,0X4100,0X81C1,0X8081,0X4040 // F
};
# define _crc1608revupdatemacro(d,a,t) \
*(a) = ((*(a)>> 8)^(t)[(*(a)^(d))&0x000000FF])
/******************************************************************************
* 函數原型: unsigned int crc1608strrevCrC16(char *buf, char nn, int *crcp); *
* 功能: 計算CRC的值并更新CRC累加器值 *
* 說明: 1.本函數采用了"反序查表"的算法 *
* 2.buf為所校驗數組第1個字節的指針,nn為需要校驗字節的個數 *
* 3.crcp存儲計算出的CRC校驗值 *
******************************************************************************/
unsigned int crc1608strrevCRC16 (char *buf, char nn, int *crcp)
{
// calculates CRC for a string using the table-lookup method
// reversal sequence
char i;
unsigned int acc;
acc = 0x0000;
for(i = 0; i < nn; i++)
_crc1608revupdatemacro(
(unsigned int)(unsigned char)buf[i], &acc,
_crc1608_0xA001_);
if(crcp)
*(unsigned int *)crcp = acc;
return (unsigned int)acc;
}
# undef _crc1608revupdmacro
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -