首 页 | 培训频道 | 思科频道 | 华为频道 | 技术论坛 |
湖南长沙思科培训 咨询电话:0731-5552235
考试认证 | Cisco产品 | 解决方案 | 综合技术 | 路由技术 | 交换技术 | 网络管理 | 网络协议 | 无线技术 | 安全技术
您现在的位置: 龙光CISCO频道 -> 综合技术 -> 综合运用 -> 文章正文
FCS与CRC

龙光国际 收集整理  06月02日 09:37  访问次数 

网络通信中帧校验场称为FC(Frame Check)场或称为帧校验序列FCS(Frame check Squence)。SDLC/HDLC均采用16位循环冗余校验码CRC(Cyclic Redundancy Code)。除了标志场和自动插入的“0”以外,所有的信息都参加CRC计算。

FCS码的具体算法是:从一帧数据的开始到帧正文结束(FCS之前)所有数据字符的ASCI I码执行“异或”操作的结果,此结果是一个8位二进制数,然后分别把其高4位和低4位转换成两个16进制数并看成ASCII码。


CRC算法原理:
关键词:CRC、多项式、查表法 
 在编写数据传输程序时,数据容错是一个非常重要的问题。循环冗余位校验(CycliclRedundncyCheck英文简称CRC)是目前运用非常广泛的一种数据容错方法,在数据传输,数据压缩等领域运用极其广泛。CRC的实现分为硬件和软件两种方法,其中软件实现的关键在于计算速度。如果单纯模拟硬件实现方法,则计算速度较慢。笔者在编制一个数据通讯软件中,运用了一种新颖的查表法计算CRC,速度很快,效果极佳。

  首先介绍其原理,如果每次参与CRC计算的信息为一个字节,该信息字节加到16位的累加器中去时,只有累加器的高8位或低8位与信息字节相互作用(异或),相互作用(异或)的结果记为组合值,那么累加器中的新值等于组合值加上(按模2异或)累加器中未改变的那一半即为新的CRC值。

  组合值只有256种可能,因此可利用硬件模拟算法先算好它们的CRC值预先填入一张表中,该表的每一单元对应相对值的CRC。这样就可以通过查表法来计算CRC值,以便大大提高CRC运算的速度。下面给出用C语言编制的计算程序。

  首先将CRC生成多项式及CRC值表定义为一个头文件CRC.H:

  #defineCRC_CCITT0x1021 //CCITT多项式

#defineREV_CCITT0x8408 //反转CCITT多项式

#defineCRC160x8005 //CRC16多项式

#defineREV_CRC160x

001 //反转CRC16多项式

unsignedshortcrc_tble[256]; //CRC值表

注:16位CCITT多项式(X16+X12+X5+1)和16位CRC16多项式(X16+X15+X2+1)为两种最常用的CRC多项式。反转多项式是指在数据通讯时,信息字节先传送或接收低位字节,如重新排位影响CRC计算速度,故设反转多项式。

  造表和查表法CRC计算函数。

#include"crc.h"

voidmk_crctble(unsignedshortgenpoly)

unsignedshortcrc_tble[256];

unsignedshort

ccnum=0;

unsignedshorti,j,k;

for(i=0,k=0;i<256;i++,k++)

   i<<=8;

for(j=8;j>0;j--)

       if((i^ccnum)&0x8000)



ccnum=(

ccnum<<=1)^genpoly;

       else

ccnum<<=1;

   i<<=1;    

crc_tble[k]=

ccnum;   

voidcrc_upd

te(unsignedshortd

t

,unsignedshort

ccnum)



ccnum=(

ccnum<<=8)^crc_tble[(

ccnum>>8)^d

t

]; 

注:genpoly为CRC多项式,

ccnum为累加器值(即为新的CRC值),d

t

为参与CRC计算的信息。






最新文章
热门文章
相关文章
关于我们 | 联系我们 | 成功客户 | 师资介绍 | 会员服务 | 培训报名 | 免责声明
龙光热线:0731-5552235 2762886  传真:0731-5552235
 龙光国际教育中心  版权所有