CRC校验算法的设计与实现

2019-09-10 13:50崔彦坤马萌
计算机与网络 2019年1期

崔彦坤 马萌

摘要:介绍了循环冗余校验(CRC)算法的原理和循环冗余校验算法设计分析过程,给出了使用查表法详细的算法设计。描述了VEE可视化语言中使用的重要模块及使用VEE语言实现CRC校验算法的具体设计过程,并且给出了详细的设计流程,该方法校验速度非常快,提高了计算机网络通信的速度和报文传输的准确性,使用手动算法举例验证了该算法的准确性。

关键词:循环冗余;CRC校验;VEE可视化语言

中图分类号:TP316文献标志码:A文章编号:1008-1739(2019)01-62-3

0引言

计算机串口通信中,为防止数据通信错误,一般采用奇偶校验法和纠错校验法等方法进行校验。但在一些通信安全要求严格的场合,上述2种方法均不能满足要求,需要采用CRC校验原理进行校验。CRC校验法是一种在数据通信和数据压缩中广泛使用的循环校验法,以低出错率保证数据的可靠无差错传输,因此,已被标准化纳入TCP/IP和其他协议的校验中,并且遵循ISO/OSI标准工业现场总线通信(IEC61158)。

随着通信领域的快速发展,数据传输的可靠性显得尤为重要,为了保证数据在传送过程中的正确无误,不仅需要高可靠的硬件电路,同时还需要查错检查机制。CRC校验法是数据通信领域中最常用的一种查错校验法,其特征是信息字段和校验字段的长度可以任意选定,CRC校验法也具有数据传输检错功能,对数据进行多形式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性[1]。

1 CRC校验的原理

CRC校验原理实际上就是在一个P位二进制数据序列之后附加一个r位二进制检验码,从而构成一个总长度为n=P+r位的二进制序列,附加在数据序列之后的这个校验码与数据序列的内容之间存在着某种特定的关系[2]。如果因干扰原因,数据序列中的某一位或某些位发生错误,这种特定的关系就会被破坏,因此,通过检查这一关系,就可以实现对数据正确性的检查。

CRC校验就是一种被广泛采用的错误检验编码,是计算机网络通信中运用最多的一种可靠性很高的检错编码方式,是由分组线性码的分支而来,有较少的冗余位,漏检率很低,从而可以有效地提高传输速度。其二元码组编码简单且误判概率很低,在通信系统中得到了广泛应用。循环冗余校验的算法实现包括硬件实现和软件实现,硬件实现速度很慢,软件实现方法就相对较快[3],以太网就采用32位的循环冗余校验编码方式。

2循环冗余校验算法

2.1 VEE可视化语言

不同的语言对算法的实现过程都是一样的,现在的编程语言种类繁多,由于通信设备对设备的控制及仪器之间处理要求比较严格,因此在数据校验方面要求更為严格。VEE是一种主要用于仪器控制和测量处理的可视化编程语言,它集成仪器设备控制、高级数据采集及处理、数据分析显示等众多先进技术,可运行于Windows,SUN,Unix等多种平台的测试软件开发环境,其强大的使用图形显示以及便捷的程序设计能力,为过程控制及测试、测量自动化提供了很好的解决方案。它还适用于产品的跟踪测试,包括从产品设计、生产及品质控制等一系列的产品指导过程,其基本单元是一系列的功能控件,所有功能控件是在VEE下选取和创建的,连线完成一次程序[4],使用VEE自动测试语言设计测试平台在测试领域已经很普遍,本文主要使用VEE可视化语言实现CRC校验算法的设计过程。

2.2具体算法过程

使用VEE语言设计CRC校验过程中,先将字符串转为以字节为单位的数组,分别输出每个字节进行逐一循环校验,最终CRC校验码为“源CRC校验码”(初始为0,可视为0000,0000,0000,0000)的高8位左移后与本字节异或(异或结果设为)。查表取第位的值(这个值是16位的)与“源CRC校验码”异或后得出的16位是“CRC校验码”,将刚得出的“CRC校验码”赋值给“源CRC校验码”,继续进行下一个字节的校验,直到最后一个字节校验完成后得出“CRC校验码”,即为这段字符串的“最终CRC校验码”,并在该数据段的末尾加上该校验码,这样就构成了一个完成的数据包,以12ab为例介绍CRC检验具体实现过程[5],主要设计流程如图1所示。

①使用VEE语言实现字符串转数组,先确定字符串长度,再算出字节数。分别将字符按顺序2个一组取出,并将取出的字节转换成一维数组,然后输出。主要使用到的模块有strLen(str),该模块为取字符串长度,然后通过除2和循环单独取字节,strFromLen (str,from,len)中str代表要转换的字符串,from代表要开始截取的字符,len代表截取字符的总长度,其次还是用到collector收集器,使用这3个模块和基本的计算循环便可实现字符串转数组。

②进制转换在CRC校验中使用最多,主要包括十进制转二进制、十进制转十六进制、二进制转十进制,十六进制转十进制、十六进制转二进制等,以十进制转十六进制为例,主要思想就是除16,整个十进制数循除以16的0次方、1次方、2次方和3次方,除后所得余数和除数(取整)分别记录在相应的位置,余数10~15分别对应字母a~f,以1234为例,1234/162取整为4,余数为210,210/161取整13,余数为2,则十进制1234对应的十六进制数为ox04d2。

③手动计算异或即转换成二进制后,0和1同则0,异则1,VEE可视化语言里的bitXor(x,y)实现了计算异或功能,直接输入需要的异或值,便可直接输出结果。

④计算循环冗余校验码表,外循环从0~255,每次循环把要计算字节送入余数单元(4 byte)最低位字节中,然后左移8位。内循环次数为8,每次循环先将余数单元中数据左移一位,最低位补0。2次循环结束之后就可以算出整个循环冗余校验码表,即把0~255的CRC码计算出来,存储至表格里,然后再根据字节查询对应CRC码。

3试验仿真

CRC校验是通信设备常用的一种校验法,VEE可视化语言是安捷伦公司推出的一款专门控制仪器仪表及设备的语言,使用VEE语言控制设备进行通信就需要使用到CRC校验来验证数据传输的正确性,因此使用VEE设计实现CRC校验是控制通信设备进行设备远程测试的重要環节。

CRC校验有计算和查表2种方法,计算法(以CRC16为例)为校验数转换为二进制数后左移16位,然后开始与17位二进制(1000 1000 0001 0000 1)异或,直到把右边最后一位异或完成为止,所得结果转换为16进制,即为该校验数的校验码,以计算法来验证12ab的校验过程,具体过程为:

根据手动校验12ab来验证该程序的准确性,最终结果与程序一致。2个字节的计算相对比较简单,可是在现实设备使用中字节相当长,如果使用手动计算特别耗费人力和时间,经过多方验证,该程序与手动计算完全一致。

4结束语

本质上循环冗余校验计算的就是移位和异或,所以一次处理移动几位都没有关系,只要做相应的处理就好了。循环冗余校验实现简单、检错能力强,提高了通信速度,占用系统资源少,用软硬件均能实现,一定程度上解决了传输速率和校验时间的矛盾,是计算机网络通信中对数据包进行检错很好的手段[6]。CRC是一种常用的检错校验法,它不具备自动纠错,只要经过严格的校验,并使用足够多的排查,那么出现检测不到的差错概率就会很小,使用CRC差错检测技术只能做到无差错传输,并不可保证完全可靠传输。

参考文献

[1]许伟,王晓燕. CRC算法在计算机网络通信中的应用[J].数字技术与应用,2014(2):119.

[2]秦红磊,路辉,朗荣玲.自动测试系统———硬件及软件技术[M].北京:高等教育出版社,2007.

[3]陶传会.浅议CRC算法在计算机网络通信中应用[J].信息与电脑(理论版),2011(5):136.

[4]听雨轩工作室.AgilentVEE虚拟仪器工程设计与开发[M].北京:国防工业出版社,2004.

[5]邱林海.多媒体通信中CRC码及其快速算法设计[J].小型微型机算机系统,1998(11):18-20.

[6]刘星华.循环冗余校验校验在单片机系统中的软件快速实现[J].福建工程学院学报,2007,5(1):76-78.