CRC 循环冗余校验

前言

   CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式。它通常应用在数据链路层的差错检测。在mac帧中,将原始数据处于除数(生成多项式)把得到的余数叫做FCS(帧校验序列FCS)加到mac帧的尾部。CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。当原数据传输时,当需要检测这个数据是否在传输中出错时,就用除数P进行想用的除数运算(通常为模2运算),如果余数0就接受,如果不为0丢弃。
常用的生成多项式(即算法中的除数,X1 就代表1号为有效位1,未给出的都为0):
CRC8=X8+X5+X4+X0
CRC-CCITT=X16+X12+X5+X0
CRC16=X16+X15+X2+X0
CRC12=X12+X11+X3+X2+X0
CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X0
eg: 位宽为4的多项式生成器生成FCS帧检验序列
这里写图片描述

CRC代码实现

short int  crc16(unsigned char *addr, int num, short int  crc)
{
    int i;
    for (; num > 0; num--)              /* 1 个1个字节的读取数据  */
    {
        crc = crc ^ (*addr++ << 8);     /* 从数据中读取一个字节,左移8位后,与16位的CRC异或*/
        for (i = 0; i < 8; i++)             /*对每一字节的数,模2运算进行8次*/
        {
            if (crc & 0x8000)           
                crc = (crc << 1) ^ POLY;    
            else                         
                crc <<= 1;                  
        }                            
        crc &= 0xFFFF;                  
    }                               
    return(crc);                   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值