📄 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 + -