1、 西 北 工 业 大 学 project 专 用 纸 Noi题目:校验码的计算姓名: 周小多 学号: 2013302513 班号: 10011302 时间: 2015.11.1西 北 工 业 大 学 project 专 用 纸 Noii计算机学院时间:目 录摘 要1 目的 12 要求 13 相关知识 .14 实现原理及流程图 .35 程序代码 .66 运行结果与分析 .147 参考文献 .14西 北 工 业 大 学 project 专 用 纸 No1题目:校验码的计算1、 目的计算 CRC 冗余校验码(32)2、要求2、 相关知识百度百科:RC 即循环冗余校验码(Cyclic Redundan
2、cy Check1 ):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。循环冗余校验码(CRC)的基本原理是:在 K 位信息码后再拼接R 位的校验码,整个编码长度为 N 位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为 N-K=R 的多项式 G(x)。根据 G(x)可以生成 K 位信息的校验西 北 工 业 大 学 project 专 用 纸 No2码,而 G(x)
3、叫做这个 CRC 码的生成多项式。 校验码的具体生成过程为:假设要发送的信息用多项式 C(X)表示,将 C(x)左移 R 位(可表示成 C(x)*2R),这样 C(x)的右边就会空出 R 位,这就是校验码的位置。用 C(x)*2R 除以生成多项式 G(x)得到的余数就是校验码。任意一个由二进制位串组成的代码都可以和一个系数仅为0和1取值的多项式一一对应。例如:代码 1010111 对应的多项式为x6+x4+x2+x+1,而多项式为 x5+x3+x2+x+1 对应的代码 101111。4、实现原理及流程图CRC 校验码的编码方法是用待发送的二进制数据 t(x)除以生成多项式 g(x),将最后的余
4、数作为 CRC 校验码。其实现步骤如下:(1) 设待发送的数据块是 m 位的二进制多项式 t(x),生成多项式为 r 阶的 g(x)。在数据块的末尾添加 r 个0,数据块的长度增加到 m+r 位。(2) 用生成多项式 g(x)去除 ,求得余数为阶数为 r-1的二进制多项式 y(x)。此二进制多项式 y(x)就是t(x)经过生成多项式 g(x)编码的 CRC 校验码。(3) 用 以模 2 的方式减去 y(x),得到二进制多项式 。 就是包含了 CRC 校验码的待发送字符串。西 北 工 业 大 学 project 专 用 纸 No3从 CRC 的编码规则可以看出,CRC 编码实际上是将代发送的 m
5、 位二进制多项式 t(x)转换成了可以被 g(x)除尽的 m+r 位二进制多项式 ,所以解码时可以用接受到的数据去除 g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。许多 CRC的硬件解码电路就是按这种方式进行检错的。同时 可以看做是由 t(x)和 CRC 校验码的组合,所以解码时将接收到的二进制数据去掉尾部的 r 位数据,得到的就是原始数据。为了更清楚的了解 CRC 校验码的编码过程,下面用一个简单的例子来说明 CRC 校验码的编码过程。由于 CRC-32、CRC-16、CCITT 和 CRC-4 的编码过程基本一致,只有位数和生成多项式不一样。为
6、了叙述简单,用一个 CRC-4 编码的例子来说明 CRC 的编码过程。设待发送的数据 t(x)为 12 位的二进制数据100100011100;CRC-4 的生成多项式为 g(x)= ,阶数 r为 4,即 10011。首先在 t(x)的末尾添加 4 个 0 构成 ,数据块就成了 1001000111000000。然后用 g(x)去除 ,不用管商是多少,只需要求得余数 y(x)。下表为给出了除法过程。西 北 工 业 大 学 project 专 用 纸 No4从上面表中可以看出,CRC 编码实际上是一个循环移位的模 2 运算。对 CRC-4,我们假设有一个 5 bits 的寄存器,通过反复的移位和
7、进行 CRC 的除法,那么最终该寄存器中的值去掉最高一位就是我们所要求的余数。所以可以将上述步骤用下面的流程描述:/reg 是一个 5 bits 的寄存器把 reg 中的值置 0. 把原始的数据后添加 r 个 0. While (数据未处理完) Begin 除数次数 被除数/ g(x)/结果 余数1 0010001110000001 001100 0001001110000001001110000001 00111000000 1 0011 10 0000100000010000001 0000001 001120 0011001100西 北 工 业 大 学 project 专 用 纸 No5
8、If (reg 首位是 1) reg = reg XOR 0011. 把 reg 中的值左移一位,读入一个新的数据并置于register 的 0 bit 的位置。 Endreg 的后四位就是我们所要求的余数。这种算法简单,容易实现,对任意长度生成多项式的G(x)都适用。在发送的数据不长的情况下可以使用。但是如果发送的数据块很长的话,这种方法就不太适合了。它一次只能处理一位数据,效率太低。为了提高处理效率,可以一次处理 4 位、8 位、16 位、32 位。由于处理器的结构基本上都支持 8 位数据的处理,所以一次处理 8 位比较合适。为了对优化后的算法有一种直观的了解,先将上面的算法换个角度理解一
9、下。在上面例子中,可以将编码过程看作如下过程:由于最后只需要余数,所以我们只看后四位。构造一个四位的寄存器 reg,初值为 0,数据依次移入 reg0(reg 的 0位),同时 reg3 的数据移出 reg。有上面的算法可以知道,只有当移出的数据为 1 时,reg 才和 g(x)进行 XOR 运算;西 北 工 业 大 学 project 专 用 纸 No6移出的数据为 0 时,reg 不与 g(x)进行 XOR 运算,相当与和 0000 进行 XOR 运算。就是说,reg 和什么样的数据进行 XOR 移出的数据决定。由于只有一个 bit,所以有 种选择。上述算法可以描述如下,/reg 是一个
10、4 bits 的寄存器初始化 t=0011,0000把 reg 中的值置 0. 把原始的数据后添加 r 个 0. While (数据未处理完) Begin 把 reg 中的值左移一位,读入一个新的数据并置于register 的 0 bit 的位置。reg = reg XOR t移出的位End上面算法是以 bit 为单位进行处理的,可以将上述算法扩展到 8 位,即以 Byte 为单位进行处理,即 CRC-32。构造一个四个 Byte 的寄存器 reg,初值为 0x00000000,数据依次移入 reg0(reg 的 0 字节,以下类似),同时 reg3 的数据移出 reg。用上面的算法类推可知,
11、移出的数据字节决定西 北 工 业 大 学 project 专 用 纸 No7reg 和什么样的数据进行 XOR。由于有 8 个 bit,所以有 种选择。上述算法可以描述如下:/reg 是一个 4 Byte 的寄存器初始化 t/共有 256 项把 reg 中的值置 0. 把原始的数据后添加 r/8 个 0 字节. While (数据未处理完) Begin 把 reg 中的值左移一个字节,读入一个新的字节并置于 reg 的第 0 个 byte5、程序代码(以附件形式,编程环境:VC+6.0)project1.1 .cpp 测 试 文 件 .txt西 北 工 业 大 学 project 专 用 纸 No86、运行结果与分析因为该文件大于 1500 字节故把文件拆分成许多份分别计算 CRC参考文献CSDN 博客 http:/ CRC 冗余校验码