CRC校验算法分析及C语言实现
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
# # & # # & & # # # # & & & & & & # & & # # # & # # & # & & # # # & # & & # & & # # & # # # 2 ( 3 4 # && ## ) 0 1 , * . 0 ) & & & & ! ##&&&&&& * + , . /& # # && * + , . # # & && ’ ( ) # & ## * + , . # & # #& & # &# ’ ( ) * + , . & # & #& * + , . # & # && ’ ( ) & # ##
运算, 让被校验数据能为某一提前选定的生成多项式所除, 如果能除尽, 表明代码正确, 如果除不尽, 表明代 码错误, 余数则指明出错位所在位置% 因为任意一组仅由信息位组成的码, 很可能除不尽, 所以在信息位后附 加若干称为校验位的冗余位, 可以保证由信息位和冗余位组成的码组能被生成多项式整除, 如图’所示% 生成多项式的选取决定了校验位的宽度以及编码的检纠错能力, 通信系统中常用的生成 * + * 校验中, 多项式为: / * + *$ ’ , 0 + * / * + *$ ’ , * 7 . . (5) , 4 $$% ’ % " " 1 6 (5) , 4 $$% ’ ’ " ! ’ 6 … ’ … ’ " " " ’ ’ ’ &$ ’ &$ ! " " ($ ’ ($ ! ’ " " ! #" ! #
图! 直接实现方法与模! 除法的比较
=$ >$ ;$ /$ 5$ !$ #$ & " $ 采用直接实现方法, 用 “ "” 和 “ ?” 分别表示逻辑与运算和异或运算, 则第 # 次循环 (步骤 ( ) ( ) ) 后, 寄存 ! ! / 器中的高位字节为: ( ) @ A @ E :# > # ; # / # 5 # ! # # # &% = ? # = " =$ >$ ;$ /$ 5$ !$ #$ & BC D $ 由此得, 第二次循环后寄存器中的最高位为: ( ) @ A F @ : # ; ? # = " > ? # > ? # = " = " =… BC $ $ $ 不难看出, 经过<次循环后, 寄存器中的最高位是由寄存 器<次循环前的高<位数据和生成多项式决定的, 即<次循环 后, 生成多项式与寄存器是否异或, 仅由循环前寄存器的高 < 位数据和生成多项式决定" 考虑到异或运算有以下性质: 若8 #$ 8 !$ … $ 8 %:9 则8 &$ 8 #$ 8 !$ … $ 8 %:8 &$ 9 所以, 若< 次循环后的异或运算结果 G E H I J @已经计算出 来, 则将寄存器中的数据左移 < 位后再与 G 得到的 E H I J @异或, 结果和采用直接实现方法逐位处理的结果是一致的" 因此, 可 提前计算出<次循环后的异或运算结果, 将其存于表中, 并用 寄存器的高<位作为索引值, 从而可将上述的<次循环简化为一次查表运算和一次异或运算" 由于索引值为 所以, 表长为! , 若采用 $ , 查找表的每个单元就是 # 这样, 可将寄存器中的每个字节看做 <位, ; > % $ # > > 位" 直接实现方法中的一位, 因此, 便有了下述表驱动算法: ( )置寄存器初值为 # & " 万方数据
信息位 校验位
/ (5) , * + *$ # ! 0 8 * * / 4 $$% ’ " * ’ ’ 8 9 ( 6 编码方法 ’ ) ’ ($) 为( 次, 信息码多项式为 * ($) , 编码步骤如下: 设生成多项式 )
(乘 ( ) ( )用 $ 即在信息位后附加( 个 “ ” ’ *$ , " % ( ( ) ($) 除以 $* ($) , 得到商式 + ($) 和余式( ($) , 即 ! )
* + * 校验算法分析及 * 语言实现
张丽杰’,吕少中’,马学民!
( 内蒙古工业大学 信息工程学院, 内蒙古 呼和浩特 " ; 包头医学院, 内蒙古 包头 " ) ’ ) ’ " " , ! ! ) ’ " ’ " 摘 ) 码的表驱动实现方法, 并用 * 语言编写程序予以验证, 所提供的程 要:详细分析了循环冗余校验 (* + *
图+ 表驱动实现方法
・* /・
内蒙古师范大学学报 自然科学 (汉文) 版
第$ $卷
( )寄存器进行左移运算, 高"位移出, ! "个信息位移入# ( )用 ( ) 中移出的高"位作为索引值查表# 设查表结果为% $ ! & ’ ( ) # ( )用寄存器与% * & ’ ( )异或的结果对寄存器重新赋值# ( )如果还有信息位 (包括附加的! 个, ) , 则返回 ( ) , 否则结束# + ! 运算完毕后, 寄存器中存放的就是余数# 例如, 信息位为$ 生成多项式为(最高位 “ ” 对运算结 ., , ! . 果不影响, 可缺省) 选取一个采用直接实现方法, 信息位为 , 寄存器的最终结果为 # /位宽的寄存器, , . 时, 信息位为$ 寄存器的最终结果为 ! 所以, 索引值为 , , , , , ., . 时, , 0 + .# , . 和$ . 时的查表结果分别为 图$给出了表驱动实现方法的运算结果, 不难看出, 该结果与逐位处理得到的结果一致# , , , , . 和! , 0 + .#
$ 程序设计
$ # - 任意 1 2 1 校验的软件实现 为了保证程序适合任意生成多项式, 且便于修改, 声明了一个包括生成多项式、 校验位宽度、 寄存器初值 的结构体3 因为算法中提到的信息位是指原有信息位再附加 “ ” , 所以程序中用了两个循环# 第-个循环 4 5 % # , 完成原有信息位的移位、 查表、 异或运算等操作, 第!个循环完成附加 “ ” 的相应操作# 为了验证程序是否正 , 确, 采用了 6 (; 及其测试数据 (字符串 “ ” ) 程序代码如下: 78 9 : 71 2 1 8 < => , ! .) ! $ * + / ? " @ # ! A ) B C D ) E F 4 5 3 G 3 @ … [] “ ” , ; 3 H & G4 ) E E & ) > ! $ * + / ? " @ ! ’ ( J 5 & A G I 5 3 4; 3 4 5 % % 3 4, ! K [ ] , , , F D E C D ) A ( L D % & ’ ( ) ! + / >{ , / @ / / + $ @ $ $ , I I …, , } ; + ? @ ? @ / @ + ? $ / + / , / / C D C % C & ( C M ) ; % 3 4# 3 4 5 N C A % H > / ; % 3 4# 3 4 5 C D C % > , O , , , , 5 3 4>P % 3 4; K ; ’ ( J 5 & A G >4 ) E E & ) I ; ’ ( J 5 ( ) D > E F 4 5 3 G 3 / ; ) O % G 5 ( ) D > 5 3 4Q" 3 4 5 N C A % H " K ; 5 3 4Q" 3 4 5 G ) > 5 3 4Q" 3 4 5 C D C % K I K / / 3 & ( 3 F ( & % ) 3 G 3 ( { N H C ( ) ’ ( J 5 ( ) D QQ) ( 5 3 4Q" C D A ) O > 5 3 4Q" 3 4 5 G ) "" K K I ) ; 3 4 5 N C A % H Q "P , O , , B B ( ) 5 3 4Q" 5 3 4Q" 3 4 5 G ) > 3 4 5 G ) ## " $ K K I I ! ’ ( J 5 & A G RR; [ ] ; 5 3 4Q" 3 4 5 G ) S > % & ’ ( ) C D A ) O K I } ( { N H C ( ) ) O % G 5 ( ) D QQ) ( 5 3 4Q" C D A ) O > 5 3 4Q" 3 4 5 G ) "" K K I ) ; 3 4 5 N C A % H Q " P , O , , B B ( ) ; 5 3 4Q" 5 3 4Q" 3 4 5 G ) > 3 4 5 G ) ## " K K I I [ ] ; 5 3 4Q" 3 4 5 G ) S > % & ’ ( )C D A ) O K I } … }
纠错或检纠错, 但不论用途如何, 如果校验和 (余数) 求出, 只需简单的判断便可 * + * 校验可用于检错、 进行检错或纠错) 因此, 本文重点讨论对于任意码多项式的余数的计算方法及实现)
收稿日期: ! " " # $ " % $ ! & 万方数据 作者简介:张丽杰 ( , 女, 辽宁省康平县人, 内蒙古工业大学讲师) ’ & (
在代数编码理论中, 为了便于计算, 把码组中各码元当作一个多项式的系数, 即长为 ! 的码组 (" !$ ’
!$ ’ !$ ! … … ’ ) 可表示成 # ($) " " 2 " $ 3" $ 3 3" $3" * + * 校验正是利用码多项式的模 ! !$ ! " " !$ ’ !$ ! ’ "%
第# #卷 第 ’期 ! " " -年 #月
内蒙古师范大学学报 自然科学 (汉文) 版 ( ) : ; < = > ? @ ; A 7 > > B =C ; > ; @ E ?F ; = G ? @H > E I B = J E K ? K < = ? @ M N E B > N BO P E K E ; > D L F
第 #期
张丽杰 等: $ % $ 校验算法分析及 $ 语言实现
・/ ;・
! 表驱动方法分析
! " # 直接实现方法 由于任何硬件系统的寄存器资源都是有限的, 所以选取一个数 $ % $ 算法的核心是如何实现除法运算" 十位、 甚至数百位宽度的寄存器实现除法运算是不可行的" 因此, 可以选一个宽度为 ! 位 (生成多项式的次 (信息位宽度与校验位宽度之和) 除法运算" 因为模!运算恰好等价 数) 的寄存器, 采用反馈的方法实现 " 位 于异或运算, 所以可用如下步骤求 $ % $ 校验和: ( )置寄存器初值为& # " ( )寄存器进行左移运算, 下一个信息位移入, 最高位移出" ! ( )判断第 ( ) 步中移出的最高位, 如果为# , 则用寄存器与生成 5 ! 否则, 执行 ( ) 多项式的低! 位异或的结果对寄存器重新赋值" / " ( )如果还有信息位 (包括附加的! 个& ) , 返回 ( ) , 否则结束" / ! 运算完 毕 后, 寄 存 器 中 存 放 的 就 是 余 数" 例 如, 生成多项式 , 信息位是 # 由于采用宽度为 ; 的 6 6 7 8 9: # & & # # # & & " 7 8 9 作为除 所以选取一个 / 位宽的寄 数进行除法运算, 得到的余数不超过/位, 图! 给出了上述算法以及模 ! 除法的运算过程, 不难看 存器即可" 出, 二者在过程和结果上均是相符的" ! " ! 表驱动实现方法 为了提高编码和解码的速度, 考虑将上述简明方法中每次处理 若寄存器中的第#个字节为: 一位改为每次处理<位" , # = # > # ; # / # 5 # ! # # # & 生成多项式的高<位为:
图’ 循环冗余编码结构
(( ) ($) $ *$ ( ($) 2+ 3( ) % ( ) $ ) )$ (( ) ( ) ( )输出码多项式为 # ($) # 2$ *$ 3 ($ % ’ ) ! 解码方法 将收到的编码用生成多项式去除, 若码字无误则余数为" 否则, 余数不为" , 通过查表可以确定出错位) )
序代码可作为函数直接嵌入软件系统中) 关键词:循环冗余校验 (* ) ;生成多项式;查找表 + * 中图分类号: . / ! " ! ) ! 文献标识码: 0 文章编号: ( ) ’ " " ’ $ % ( # 1 ! " " " ’ $ " " $ " -
在网络系统中, 为了保证在数据链路层建立可靠、 透明的链接, 可以加入足够的冗余数据以便于检测错 误, 从而重传数据帧) 循环冗余校验 (* ) 就是一种被广泛采用的错误检验编码, 而掌握 * + * + * 校验算法的实 现细节, 是将其嵌入软件系统和硬件系统的重要前提) 本文详细分析了 * 并用 * + * 校验的表驱动实现方法, 语言编写程序, 验证了各项分析结果)
Q ; @ ) # #F ; ) ’ C ? = ) ! " " -
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
, & & && . / 0 1 2 + 3 4 5 ’ &() 查找表 & & & & ! +,&&&& # & * & & & & * #& &&&& & & & +, . / 0 1 2 & … && & & +, & ( ) * , *’ #+ 5 6 7 / 1 6 5 & +, && . / 0 1 2 & 3 4 5 +, && …
运算, 让被校验数据能为某一提前选定的生成多项式所除, 如果能除尽, 表明代码正确, 如果除不尽, 表明代 码错误, 余数则指明出错位所在位置% 因为任意一组仅由信息位组成的码, 很可能除不尽, 所以在信息位后附 加若干称为校验位的冗余位, 可以保证由信息位和冗余位组成的码组能被生成多项式整除, 如图’所示% 生成多项式的选取决定了校验位的宽度以及编码的检纠错能力, 通信系统中常用的生成 * + * 校验中, 多项式为: / * + *$ ’ , 0 + * / * + *$ ’ , * 7 . . (5) , 4 $$% ’ % " " 1 6 (5) , 4 $$% ’ ’ " ! ’ 6 … ’ … ’ " " " ’ ’ ’ &$ ’ &$ ! " " ($ ’ ($ ! ’ " " ! #" ! #
图! 直接实现方法与模! 除法的比较
=$ >$ ;$ /$ 5$ !$ #$ & " $ 采用直接实现方法, 用 “ "” 和 “ ?” 分别表示逻辑与运算和异或运算, 则第 # 次循环 (步骤 ( ) ( ) ) 后, 寄存 ! ! / 器中的高位字节为: ( ) @ A @ E :# > # ; # / # 5 # ! # # # &% = ? # = " =$ >$ ;$ /$ 5$ !$ #$ & BC D $ 由此得, 第二次循环后寄存器中的最高位为: ( ) @ A F @ : # ; ? # = " > ? # > ? # = " = " =… BC $ $ $ 不难看出, 经过<次循环后, 寄存器中的最高位是由寄存 器<次循环前的高<位数据和生成多项式决定的, 即<次循环 后, 生成多项式与寄存器是否异或, 仅由循环前寄存器的高 < 位数据和生成多项式决定" 考虑到异或运算有以下性质: 若8 #$ 8 !$ … $ 8 %:9 则8 &$ 8 #$ 8 !$ … $ 8 %:8 &$ 9 所以, 若< 次循环后的异或运算结果 G E H I J @已经计算出 来, 则将寄存器中的数据左移 < 位后再与 G 得到的 E H I J @异或, 结果和采用直接实现方法逐位处理的结果是一致的" 因此, 可 提前计算出<次循环后的异或运算结果, 将其存于表中, 并用 寄存器的高<位作为索引值, 从而可将上述的<次循环简化为一次查表运算和一次异或运算" 由于索引值为 所以, 表长为! , 若采用 $ , 查找表的每个单元就是 # 这样, 可将寄存器中的每个字节看做 <位, ; > % $ # > > 位" 直接实现方法中的一位, 因此, 便有了下述表驱动算法: ( )置寄存器初值为 # & " 万方数据
信息位 校验位
/ (5) , * + *$ # ! 0 8 * * / 4 $$% ’ " * ’ ’ 8 9 ( 6 编码方法 ’ ) ’ ($) 为( 次, 信息码多项式为 * ($) , 编码步骤如下: 设生成多项式 )
(乘 ( ) ( )用 $ 即在信息位后附加( 个 “ ” ’ *$ , " % ( ( ) ($) 除以 $* ($) , 得到商式 + ($) 和余式( ($) , 即 ! )
* + * 校验算法分析及 * 语言实现
张丽杰’,吕少中’,马学民!
( 内蒙古工业大学 信息工程学院, 内蒙古 呼和浩特 " ; 包头医学院, 内蒙古 包头 " ) ’ ) ’ " " , ! ! ) ’ " ’ " 摘 ) 码的表驱动实现方法, 并用 * 语言编写程序予以验证, 所提供的程 要:详细分析了循环冗余校验 (* + *
图+ 表驱动实现方法
・* /・
内蒙古师范大学学报 自然科学 (汉文) 版
第$ $卷
( )寄存器进行左移运算, 高"位移出, ! "个信息位移入# ( )用 ( ) 中移出的高"位作为索引值查表# 设查表结果为% $ ! & ’ ( ) # ( )用寄存器与% * & ’ ( )异或的结果对寄存器重新赋值# ( )如果还有信息位 (包括附加的! 个, ) , 则返回 ( ) , 否则结束# + ! 运算完毕后, 寄存器中存放的就是余数# 例如, 信息位为$ 生成多项式为(最高位 “ ” 对运算结 ., , ! . 果不影响, 可缺省) 选取一个采用直接实现方法, 信息位为 , 寄存器的最终结果为 # /位宽的寄存器, , . 时, 信息位为$ 寄存器的最终结果为 ! 所以, 索引值为 , , , , , ., . 时, , 0 + .# , . 和$ . 时的查表结果分别为 图$给出了表驱动实现方法的运算结果, 不难看出, 该结果与逐位处理得到的结果一致# , , , , . 和! , 0 + .#
$ 程序设计
$ # - 任意 1 2 1 校验的软件实现 为了保证程序适合任意生成多项式, 且便于修改, 声明了一个包括生成多项式、 校验位宽度、 寄存器初值 的结构体3 因为算法中提到的信息位是指原有信息位再附加 “ ” , 所以程序中用了两个循环# 第-个循环 4 5 % # , 完成原有信息位的移位、 查表、 异或运算等操作, 第!个循环完成附加 “ ” 的相应操作# 为了验证程序是否正 , 确, 采用了 6 (; 及其测试数据 (字符串 “ ” ) 程序代码如下: 78 9 : 71 2 1 8 < => , ! .) ! $ * + / ? " @ # ! A ) B C D ) E F 4 5 3 G 3 @ … [] “ ” , ; 3 H & G4 ) E E & ) > ! $ * + / ? " @ ! ’ ( J 5 & A G I 5 3 4; 3 4 5 % % 3 4, ! K [ ] , , , F D E C D ) A ( L D % & ’ ( ) ! + / >{ , / @ / / + $ @ $ $ , I I …, , } ; + ? @ ? @ / @ + ? $ / + / , / / C D C % C & ( C M ) ; % 3 4# 3 4 5 N C A % H > / ; % 3 4# 3 4 5 C D C % > , O , , , , 5 3 4>P % 3 4; K ; ’ ( J 5 & A G >4 ) E E & ) I ; ’ ( J 5 ( ) D > E F 4 5 3 G 3 / ; ) O % G 5 ( ) D > 5 3 4Q" 3 4 5 N C A % H " K ; 5 3 4Q" 3 4 5 G ) > 5 3 4Q" 3 4 5 C D C % K I K / / 3 & ( 3 F ( & % ) 3 G 3 ( { N H C ( ) ’ ( J 5 ( ) D QQ) ( 5 3 4Q" C D A ) O > 5 3 4Q" 3 4 5 G ) "" K K I ) ; 3 4 5 N C A % H Q "P , O , , B B ( ) 5 3 4Q" 5 3 4Q" 3 4 5 G ) > 3 4 5 G ) ## " $ K K I I ! ’ ( J 5 & A G RR; [ ] ; 5 3 4Q" 3 4 5 G ) S > % & ’ ( ) C D A ) O K I } ( { N H C ( ) ) O % G 5 ( ) D QQ) ( 5 3 4Q" C D A ) O > 5 3 4Q" 3 4 5 G ) "" K K I ) ; 3 4 5 N C A % H Q " P , O , , B B ( ) ; 5 3 4Q" 5 3 4Q" 3 4 5 G ) > 3 4 5 G ) ## " K K I I [ ] ; 5 3 4Q" 3 4 5 G ) S > % & ’ ( )C D A ) O K I } … }
纠错或检纠错, 但不论用途如何, 如果校验和 (余数) 求出, 只需简单的判断便可 * + * 校验可用于检错、 进行检错或纠错) 因此, 本文重点讨论对于任意码多项式的余数的计算方法及实现)
收稿日期: ! " " # $ " % $ ! & 万方数据 作者简介:张丽杰 ( , 女, 辽宁省康平县人, 内蒙古工业大学讲师) ’ & (
在代数编码理论中, 为了便于计算, 把码组中各码元当作一个多项式的系数, 即长为 ! 的码组 (" !$ ’
!$ ’ !$ ! … … ’ ) 可表示成 # ($) " " 2 " $ 3" $ 3 3" $3" * + * 校验正是利用码多项式的模 ! !$ ! " " !$ ’ !$ ! ’ "%
第# #卷 第 ’期 ! " " -年 #月
内蒙古师范大学学报 自然科学 (汉文) 版 ( ) : ; < = > ? @ ; A 7 > > B =C ; > ; @ E ?F ; = G ? @H > E I B = J E K ? K < = ? @ M N E B > N BO P E K E ; > D L F
第 #期
张丽杰 等: $ % $ 校验算法分析及 $ 语言实现
・/ ;・
! 表驱动方法分析
! " # 直接实现方法 由于任何硬件系统的寄存器资源都是有限的, 所以选取一个数 $ % $ 算法的核心是如何实现除法运算" 十位、 甚至数百位宽度的寄存器实现除法运算是不可行的" 因此, 可以选一个宽度为 ! 位 (生成多项式的次 (信息位宽度与校验位宽度之和) 除法运算" 因为模!运算恰好等价 数) 的寄存器, 采用反馈的方法实现 " 位 于异或运算, 所以可用如下步骤求 $ % $ 校验和: ( )置寄存器初值为& # " ( )寄存器进行左移运算, 下一个信息位移入, 最高位移出" ! ( )判断第 ( ) 步中移出的最高位, 如果为# , 则用寄存器与生成 5 ! 否则, 执行 ( ) 多项式的低! 位异或的结果对寄存器重新赋值" / " ( )如果还有信息位 (包括附加的! 个& ) , 返回 ( ) , 否则结束" / ! 运算完 毕 后, 寄 存 器 中 存 放 的 就 是 余 数" 例 如, 生成多项式 , 信息位是 # 由于采用宽度为 ; 的 6 6 7 8 9: # & & # # # & & " 7 8 9 作为除 所以选取一个 / 位宽的寄 数进行除法运算, 得到的余数不超过/位, 图! 给出了上述算法以及模 ! 除法的运算过程, 不难看 存器即可" 出, 二者在过程和结果上均是相符的" ! " ! 表驱动实现方法 为了提高编码和解码的速度, 考虑将上述简明方法中每次处理 若寄存器中的第#个字节为: 一位改为每次处理<位" , # = # > # ; # / # 5 # ! # # # & 生成多项式的高<位为:
图’ 循环冗余编码结构
(( ) ($) $ *$ ( ($) 2+ 3( ) % ( ) $ ) )$ (( ) ( ) ( )输出码多项式为 # ($) # 2$ *$ 3 ($ % ’ ) ! 解码方法 将收到的编码用生成多项式去除, 若码字无误则余数为" 否则, 余数不为" , 通过查表可以确定出错位) )
序代码可作为函数直接嵌入软件系统中) 关键词:循环冗余校验 (* ) ;生成多项式;查找表 + * 中图分类号: . / ! " ! ) ! 文献标识码: 0 文章编号: ( ) ’ " " ’ $ % ( # 1 ! " " " ’ $ " " $ " -
在网络系统中, 为了保证在数据链路层建立可靠、 透明的链接, 可以加入足够的冗余数据以便于检测错 误, 从而重传数据帧) 循环冗余校验 (* ) 就是一种被广泛采用的错误检验编码, 而掌握 * + * + * 校验算法的实 现细节, 是将其嵌入软件系统和硬件系统的重要前提) 本文详细分析了 * 并用 * + * 校验的表驱动实现方法, 语言编写程序, 验证了各项分析结果)
Q ; @ ) # #F ; ) ’ C ? = ) ! " " -
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
, & & && . / 0 1 2 + 3 4 5 ’ &() 查找表 & & & & ! +,&&&& # & * & & & & * #& &&&& & & & +, . / 0 1 2 & … && & & +, & ( ) * , *’ #+ 5 6 7 / 1 6 5 & +, && . / 0 1 2 & 3 4 5 +, && …