CRC校验码编码实验

合集下载

CRC校验算法详解及代码实现

CRC校验算法详解及代码实现

CRC校验算法详解及代码实现CRC校验算法的原理是利用生成多项式来计算数据的校验值。

在发送端,将数据和生成多项式进行计算得到一个校验值,然后将这个校验值附加到发送的数据后面一起传输。

在接收端,接收到数据后再次进行计算,并与接收到的校验值进行比较,如果相同则说明数据传输过程中没有错误,否则说明数据传输过程中出现错误。

下面是CRC校验算法的具体步骤:1.选择一个生成多项式,通常用一个二进制数表示。

生成多项式的位数称为CRC位数,常见的有CRC-8,CRC-16,CRC-32等。

2.将生成多项式的最高位与数据的最高位对齐,然后进行异或运算。

异或运算的结果作为下一次异或运算的输入,直到将所有数据都计算完毕。

3.将计算得到的结果作为校验值附加到数据后面一起传输。

下面是一个简单的CRC校验算法的代码实现:```pythondef crc(data, generator):crc_value = 0generator_length = len(generator)for bit in data:crc_value ^= bitif crc_value & 0x1:crc_value = (crc_value >> 1) ^ int(generator, 2)else:crc_value = crc_value >> 1return crc_value#测试数据data = [1, 0, 1, 1]generator = "1011"#进行CRC校验residue = crc(data, generator)print(residue)```在上面的代码中,`data`表示要进行校验的数据,以列表的形式表示,每个元素是一个二进制位。

`generator`表示生成多项式,以字符串的形式表示,每个字符是一个二进制位。

程序输出的结果为校验值。

总结:本文详细介绍了CRC校验算法的原理和步骤,并给出了一个简单的代码实现。

CRC检验码实验报告

CRC检验码实验报告

CRC 检验码实验报告一 实验题目(1) 实现CRC 的校验过程,生成多项式为CRC12,要求设计简单的图形界面。

(2) 完成内容包括:输入发送数据序列,根据生成多项式完成余数计算,输出带有校验码的发送数据序列。

模拟正确发送、出现离散的一位错、离散的两位错以及长度小于12的突发错,给出相应的输出。

二 实验工具及环境实验语言:JAVA 实验工具:eclipese 三 实验思路 (1) 实验原理CRC 校验码的编码方法是用待发送的二进制数据t(x)移位生成多项式位数,其结果r(x)除以生成 多项式g(x),将最后的余数与上r(x)作为CRC 校验码。

(2) 实验思路 1.实现过程分实验类图2.计算CRC 检验码:1)用户输入发送数据比特序列A;2)默认为12位CRC 生成多项式,用户可根据需要自行修改CRC 生成多项式B; 3)根据B 的位数,对A 进行左移位相应的位数(相当于做2^n 的乘积运算),形成C;实现计算CRC 校验码与实现模拟出错的算法类选择应用主界面类,包括模拟CRC 出错与计算CRC 校验计算CRC 校验码界面模拟CRC 出错4)对生成多项式和发送数据流进行异或运算,计算余数D;5)余数D+C就形成了带有CRC检验码的数据比特序列。

3. CRC检验码出错模拟:用户输入原CRC检验码的数据比特序列A,选择待模拟的错误类型;程序给出相应模拟出错结果。

四实验结论1.优点1)实现了多种生成多项式CRC检验码的生成与检验2)检验与计算分开,功能明确3)可对用户输入数据进行检查,动态交互2.缺点1)在检验CRC校验码时,只能有用户手动输入数据,不能粘贴复制,比较麻烦2)页面布局与外观有待提高。

CRC编码实验实验报告

CRC编码实验实验报告
循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较, 若两个CRC值不同,则说明数据通讯出现错误。
11001———————除数
————
11110
1001
————
11111
11001
————
000100——————余数
2)
input=[1 0 1 1 0 0 1 1];crc_no=4;
k = size(input,2);
generator = zeros(1,crc_no+1);
output = zeros(1,k+crc_no);
end
output = [input output(1:crc_no)];
n = size(input,2);
output = input(1:n-crc_no);
forii = 1:n-crc_no
if(input(1) == 1)
input(1:crc_no+1) = mod((input(1:crc_no+1)+generator),2);
而发送信息位 1111,可转换为数据多项式为C(x)=x^3+x^2+x+1。
2)、生成多项式
是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。

CRC实验报告

CRC实验报告

沈阳工程学院学生实验报告实验室名称:信息工程系软件实验室实验课程名称:计算机网络实验项目名称:CRC校验编程实现班级:软本094姓名:王诗娟陈志银刘云峰学号:02、10、14实验日期:2012年03月26日实验台编号:15 指导教师:郑秀颖批阅教师(签字):成绩:一.实验目的掌握并理解CRC校验算法,编程实现CRC。

二.实验内容1.设计CRC校验算法。

.2.编程实现CRC校验。

三.实验前的准备1.复习、熟悉CRC校验算法。

2.编写好程序,上机调试。

四.实验要求及实验软硬件环境【基本要求】1.掌握并理解CRC校验算法。

2.编程实现CRC。

3.完成实验报告。

【实验组织方式】小组实验。

【实验条件】配置有java运行环境的微机一台,MyEclipse。

五.实验步骤1.掌握并理解CRC校验算法。

2.设计发送界面。

3.编程实现CRC校验。

4.设计接收界面。

5.调试并实现程序。

6.参加答辩,并撰写实验报告。

六.主要程序部分(Java语言实现)1.发送端主界面MainFrame.java 的主要代码如下所示。

jb.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {String input1 = new String(jtf1.getText());String input2 = new String(jtf2.getText());if("".equals(input1) || "".equals(input2) || input1 == null || input2 == null){JOptionPane.showMessageDialog(jf, "请输入。

", "错误", JOptionPane.ERROR_MESSAGE);}else{ if(dealer.legal_binary(input1)){if(dealer.legal_g_p(input2)){String checkSum = dealer.get_cheksum(input1, input2);String endResult = new String(input1+checkSum);jtf3.setText(checkSum);jtf4.setText(endResult);try {String tem =endResult + "." +input2;fo.inputFile(tem);} catch (Exception e1) {e1.printStackTrace();}}else{JOptionPane.showMessageDialog(jf, "输入的生成多项式不正确", "错误", JOptionPane.ERROR_MESSAGE);}}else{JOptionPane.showMessageDialog(jf, "输入不正确", "错误", JOptionPane.ERROR_MESSAGE);} }}});jb2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0) {jp1.setVisible(false);GetMessage gm = new GetMessage();String str="";try {str = fo.outputFile();} catch (Exception e) {e.printStackTrace();}String L="";String R="";int k= str.length();for (int i = 0; i < str.length(); i++){if (str.substring(i, i + 1).equals(".")){L=str.substring(0,i).trim();R=str.substring(i+1,k).trim();}}gm.jtf1.setText(L);gm.jtf2.setText(R);String res = dealer. get_cheksum (str, R);gm.jtf3.setText(res);gm.setVisible(true);jf.add(gm);}});2.对发送和接收的处理类Dealer.java的主要代码如下所示。

CRC实验报告 2011-06-16

CRC实验报告 2011-06-16

数电实验报告题目 CRC校验原理仿真实验班级 29001040班姓名刘奎学号 2903003015 时间 2011年5月25日地点英才实验学院创新实验室指导教师李尚泽摘要本实验利用循环校验码(CRC)校验原理通过对通信系统发射端的原始数据生成CRC校验位,并按照RS-232的传输协议组帧,在传输过程中加入随机的噪声,在接收端对RS-232传输帧格式进行解析,并完成CRC校验。

整个过程在Modelsim上仿真实现。

关键词CRC校验仿真目录第一章实验原理与任务 (2)第二章设计思路、方法及方案 (3)第三章 FPGA模块程序设计与仿真 (3)第四章结束语 (4)附录 (4)第一章 实验任务与原理1、任务指标利用VHDL 完成16比特CRC 校验程序的设计,并能利用modelsim 仿真得到电路的时序波形。

2、实验要求在了解CRC 校验原理的前提下,在发送端对原始数据生成CRC 校验位,并按照RS-232的传输协议组帧,在接收端对RS-232传输帧格式进行解析,并完成CRC 校验。

整个过程在Modelsim 上仿真实现。

3、原理阐述循环校验码(CRC )是数据通信领域中常用的一种差错校验码,其特点是信息字段和校验字段的长度可以任意选定。

生成CRC 校验码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’或‘1’的多项式一一对应,例如‘1010111’对应的多项式为6421x x x x ++++。

CRC 码集选择的原则:若设码字长度为N ,信息字段长度为K ,校验字段长度为R ,则N=K+R ;对于CRC 码集中的任一码字,存在且仅存在一个R 次多项式g(x)使得:()()()()()RV x A x g x x m x r x ==+其中m(x)为K 次信息多项式,r(x)为R-1次校验多项式,g(x)称为生成多项式。

V(x)为发送的信息加码字多项式。

2012()...RR g x g g x g x g x=++++发送方通过指定的g(x)产生CRC 码字,接收方则通过g(x)来验证CRC 码字,若传输码字多项式V(x)能除尽g(x),则传输正确。

计算机网络实验 CRC校验

计算机网络实验 CRC校验

XXXXXXXX大学(计算机网络)实验报告实验名称 CRC校验实验时间年月日专业姓名学号预习操作座位号教师签名总评一、实验目的:掌握CRC冗余码校验的基本原理,编程实现CRC冗余码校验。

二、实验原理:1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。

例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。

3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得V(x)=A(x)g(x)=x R m(x)+r(x);其中:m(x)为K次信息多项式,r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+g2x2+...+g(R-1)x(R-1)+g R x R发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。

4、CRC校验码软件生成方法:借助于多项式除法,其余数为校验字段。

发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10信息字段校验字段接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确,三、实验内容:1.设置CRC寄存器,并给其赋值FFFF(hex)。

2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。

3.CRC寄存器向右移一位,MSB(最高位)补零,移出并检查LSB(最低位)。

4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

5.重复第3与第4步直到8次移位全部完成。

此时一个8-bit数据处理完毕。

实验三 循环冗余码效验(CRC)

实验三  循环冗余码效验(CRC)

实验三循环冗余码效验(CRC)
一、实验目的
熟悉和学习ISO/IEC18000-3,ISO15693标准规范第三部分协议,其中贯串所有指令部分CRC的内容,特别是AnnexD的内容。

理解它的原理、流程和软件实验办法。

二、实验内容
通过使用带CRC处理过程的指令和不带CRC过程的指令读取单个标签,比较其指令的读取结果。

分析实验数据,了解CRC的作用,掌握指令的应该取得的结果。

三、实验原理
ISO15693标准规范第三部分下的AnnexD部分。

四、所需仪器
供电电源、单张电子标签。

五、实验步骤
1、设置
加电运行系统,在系统的天线内放置多个标签,打开软件Tag-reader.exe.正确设置串门、操作如图
2、操作
2.1 带CRC命令操作
在系统软件下,“寻卡”处,选择“单卡识别”,确定“寻卡”动作。

操作如图所示:
清空数据,在系统软件下,“测试命令”处,选择运行“测试循环冗余校验码”,选择“发送带循环冗余校验的寻卡命令”,操作如图:
2.2不带CRC命令操作
清空数据,选择“发送不带循环冗余校验的寻卡命令”,操作如图:。

循环冗余校验编解码电路设计实验报告

循环冗余校验编解码电路设计实验报告

循环冗余校验编解码电路设计实验报告在数字通信中,循环冗余校验(CRC)是一种常用的错误检测和纠正技术,它通过在数据包中添加校验位来检测数据传输过程中的错误。

为了更好地理解和应用CRC技术,我们进行了循环冗余校验编解码电路设计的实验。

我们需要了解CRC的基本原理。

CRC是通过对数据进行除法运算,得到余数然后将余数添加到数据包中作为校验位。

接收端在接收到数据包后,再次进行除法运算,如果余数为0,则说明数据传输正确,否则说明数据传输过程中出现了错误。

在实验中,我们首先设计了CRC编码电路。

编码电路的主要功能是对输入的数据进行除法运算,然后将余数作为校验位添加到数据包中。

我们使用了Verilog HDL语言来实现CRC编码电路,在编码过程中需要考虑多项式的选取、除法运算的实现等问题。

接下来,我们设计了CRC解码电路。

解码电路的主要功能是对接收到的数据包进行除法运算,然后判断余数是否为0,从而确定数据传输是否正确。

同样,我们使用Verilog HDL语言来实现CRC解码电路,需要考虑多项式的选取、除法运算的实现等方面。

在实验中,我们还需要对设计的CRC编解码电路进行仿真和验证。

通过仿真可以检查电路的功能是否符合设计要求,验证其在不同情况下的正确性和稳定性。

我们可以使用仿真工具如ModelSim等来进行仿真,观察电路的输入输出情况,验证其正确性。

我们需要在实际硬件平台上实现设计的CRC编解码电路,并进行性能测试。

通过性能测试可以评估电路在实际应用中的性能表现,包括速度、准确性等方面。

我们可以使用FPGA等硬件平台来实现CRC编解码电路,并进行性能测试,验证其在实际应用中的可靠性。

总的来说,通过本次实验,我们深入了解了循环冗余校验的原理和实现方法,掌握了CRC编解码电路的设计与实现技术。

这将有助于我们在数字通信领域中更好地应用CRC技术,提高数据传输的可靠性和安全性。

希望通过不懈的努力和实践,我们能够进一步完善和优化CRC编解码电路,为数字通信技术的发展做出贡献。

crc校验实验报告python代码

crc校验实验报告python代码

crc校验实验报告python代码标题:CRC校验实验报告:Python代码实现与解析一、引言CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用在数据通信和存储系统中的错误检测码。

其基本原理是通过在原始数据后添加一个特定的校验码,然后在接收端再次计算并比较这个校验码,以此来判断数据在传输过程中是否发生了错误。

本实验报告将详细阐述如何使用Python语言实现CRC校验,并通过具体的代码示例进行解析。

二、CRC校验原理CRC校验的基本思想是将待校验的数据看作是一个大数,然后用这个大数除以一个预设的除数,得到的余数就是CRC校验码。

在接收端,同样的操作被执行,如果得到的余数为0,则认为数据在传输过程中没有发生错误。

三、Python代码实现以下是一个简单的Python代码实现CRC校验的例子:pythondef crc8(data):polynomial = 0x07 # 使用0x07作为生成多项式crc = 0x00 # 初始化CRC值为0for byte in data:crc ^= byte # XOR当前字节与CRC值for _ in range(8): # 对每个位进行处理if crc & 0x80: # 如果最高位为1crc = (crc << 1) ^ polynomial # 左移一位并异或生成多项式else:crc <<= 1 # 否则只左移一位crc &= 0xFF # 保留8位return crcdata = b"Hello, World!" # 待校验的数据checksum = crc8(data) # 计算CRC校验码print("CRC8 Checksum:", hex(checksum)) # 输出CRC校验码四、代码解析1. 定义CRC函数`crc8`,输入参数为待校验的数据。

计算机网络实验报告-CRC 校正

计算机网络实验报告-CRC 校正

《计算机网路》课程实验报告学院:物光学院专业:08电信班级:4班姓名:学号:实验设备:计算机1台实验日期:2010 年12月15日实验项目名称CRC 校正程序实验内容(包括步骤):内容:1 学会用C语言编写计算机网络程序2理解CRC校正的原理3编写CRC 校正程序步骤:输入比特流,比特流长度输入生产多项式数,多项式长度计算出被除数计算冗余码,再算出CRC码校正CRC码校正正确输出ok,错误输出wrong调试与结果测试:代码注释:#include "stdio.h"#include "conio.h"/*************CRC获得程序**********信息码与比对码进行移位等长比对异或********************************/void GetCRC(char m[],char g[],int ml,int gl){int i,j;for(i=0;i<ml;i++){ if(m[i]=='1')for(j=i;j<gl+i;j++){if(m[j]==g[j-i])m[j]='0';else m[j]='1';}}}/*************CRC校验程序**********与CRC的原理相同********************************/int checkCRC(char m[],char g[],int ml,int gl) { int i,j;for(i=0;i<ml;i++){ if(m[i]=='1')for(j=i;j<gl+i;j++){if(m[j]==g[j-i])m[j]='0';else m[j]='1';}}for(i=0;i<gl-1;i++)if(m[ml+i]=='1') return 0 ;return 1;}main(){ int ml,gl,i,j;char temp[30],m[30],g[30],temp2[30];printf("please input the m[i] like 101001010\n");printf("now please input the length of m[i] you want to ,but the num<30:\n");scanf("%d",&ml); /**先输入信息码的长度**/printf("now please input m[i] :");scanf("%s",m); /**输入信息码**********/printf("please input the g[i] like 101001010\n");printf("now please input the length of g[i] you want to ,but the num<30:\n");scanf("%d",&gl); /**输入比对码的长度**/printf("now please input g[i] :");scanf("%s",g); /**输入比对码********/printf("\n");for(i=0;i<gl+ml-1;i++){if(i<ml) temp[i]=m[i];else temp[i]='0';} /***信息码后面补gl-1个0*****/temp[ml+gl-1]='\0';GetCRC(temp,g,ml,gl) ; /*****获得CRC****/for(i=0;i<ml;i++)temp[i]=m[i];printf("\n");printf("deal with CRC and result:");printf("%s",temp); /***打印加了冗余码后的信息码****/for(i=0;i<gl+ml-1;i++)temp2[i]=temp[i];printf("\n");printf("check result:");if(checkCRC(temp2,g,ml,gl)==1) /***CRC 校验****/printf("OK");else printf("wrong");getch();}――――――――――――以下内容为教师填写―――――――――――――――教师评阅:成绩:年月日。

实验循环冗余检验码的编码和检错

实验循环冗余检验码的编码和检错

信息论与编码实验报告
R 完成时间:2013 年 月 日
1、循环冗余校验码(CRC )的基本原理是:
码后再拼接R 位的校验码,整个编码长度为N 位,因此,这种编码又叫(N ,K )码。

对于一个给定的(N ,K )码,可以证明存在一个最高次幂为N-K=R 的多项式G(x)。

根据G(x)可以生成K 位信息的校验码,而G(x)叫做这个CRC 码的生成多项式。

校验码的具体生成过程为:
信息用信息多项式C(X)表示,将C(x)左移R 位,则可表示成C(x)乘x 的R 次方,这样C(x)的右边就会空出R 位,这就是校验码的位置。

通过C(x)*x 除以生成多项式G(x)得到的余数就是校验码。

1、 产生如下CRC 码的Matlab 源程序(通用):
clear all;
clc;
m=input('请输入信息码字m=:','s')
g=input('请输入生成矩阵G=:','s')
len_g=length(g);
len_m=length(m);
len_m0=((len_g)+(len_m)-1);
m0=zeros(1,len_m0);
m0(1:len_m)=(m-48)
m1=m0
for i=1:(len_m0-len_g+1)
if m0(i)==1
m0(i:(i-1)+len_g)=(mod(m0(i:(i-1)+len_g)+g,2));
else i=i+1;
end
end
m0
r=len_m0-len_m
C=m0((1+len_m0-r):len_m0)
R=mod(m1+m0,2)。

单片机crc校验实验报告

单片机crc校验实验报告

单片机课程总实验——实现CRC校验一、实验目的⒈通过学习CRC原理,验证,检错,掌握其工作原理;⒉编写CRC编码程序;⒊总结实验过程,编写提交实验报告:方案、编程、调试、结果、分析、结论。

二、实验要求用单片机实现CRC校验码(10比特数据或任意数据长度、生成多项式用G (x)= x5 + x4 + x2 + 1 ),校验码显示在单片机实验系统数码管上。

二、实验器材1、装有Keil C51开发工具的PC机一台2、TD-PIT/TD-PIT-B实验装置一套三、实验原理1.设置CRC寄存器,并给其赋初始值。

2.将数据的第一个8-bit 字符与16 位CRC 寄存器的低8 位进行异或,并把结果存入CRC寄存器。

3.CRC 寄存器向右移一位,最高位补零,移出并检查最低位。

4.如果LSB 为0,重复第三步;若LSB 为1,CRC 寄存器与多项式码相异或。

5.重复第 3 与第4 步直到8 次移位全部完成。

此时一个8-bit 数据处理完毕。

6.重复第 2 至第5 步直到所有数据全部处理完成。

7.最终CRC 寄存器的内容即为CRC 值。

常用的CRC循环冗余校验标准多项式如下:CRC (12 位) =X12+X11+X3+X2+X+1 CRC (16 位) = X16+X15+X2+1CRC (CCITT) = X16+X12 +X5+1 CRC (32 位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+ X5+X4+X2+X+1 以CRC (16 位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101本次实验以10比特为例。

显示到六位数码管中。

其实验连接图如下图所示。

四、实验步骤1.打开Keil C51开发工具,新建开发工具,并保存至相应路径。

2.新建文件,编写代码。

3.按照实验连线图在实验箱上连线。

4.编译运行代码勿误后,打开实验箱,点击调试,运行。

五、实验结果经过调试程序,在实验箱数码管上显示二进制数001110.六、实验源代码#include "Absacc.h"#define C8255_A XBYTE[0x7F00] //8255端口地址定义#define C8255_B XBYTE[0x7F01]#define C8255_C XBYTE[0x7F02]#define C8255_CON XBYTE[0x7F03]//数码管显示编号unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};long MD;long GD;void delay(unsigned int time){unsigned int i;for(i=0; i<time; i++);}void display() //显示函数{unsigned char i, j = 0xDF;for(i=0; i<6; i++){C8255_A = 0xFF;C8255_B = a[b[i]]; //查表输出显示C8255_A = j;delay(0x100);j = (j>>1)|(j<<7);}}void clear() //清屏{C8255_B = 0x00;}void CRC_check(long MD1,long GD1){ long MD = MD1 ; // 需要校验的数据long GD = GD1;long tmp; //临时变量保存多个移位,或恢复原值信息int count_MD; //校验数据的位数int count_GD; //多项式的位数int count; //两者位数差long tst0 = 1; //判断余数最高位是否为0int i;tmp = MD; //数MD 有多少位tmp用于暂存MDfor(count_MD = 0 ; MD != 0 ; count_MD++)MD >>= 1;MD = tmp;tmp = GD; //数GD有多少位tmp用于暂存GDfor(count_GD = 0 ; GD != 0 ; count_GD++)GD >>= 1;GD = tmp ;//构造CRC码序列for(tmp = 1 ; tmp < count_GD ; tmp ++) //左移count_GD-1位MD <<= 1;count = count_MD - 1;//将GD 与MD 构造等长,低位用0填充tmp = count; //长度均为count_GD+count_MD-1while(count--){GD <<= 1 ;}count = tmp;//tst0 和MD 求与运算,确定MD最高位是否为1,确定是否应该求模tmp = count_GD + count_MD -1 ;while(--tmp) //循环tmp-1次,位数为1+tmp-1tst0 <<= 1;//模二除法的实现for( ; count >= 0 ; count--){ if(tst0 == (tst0&MD)) //MD与最高位为1 当除不尽时最高位为0,//余数比除数少一位{MD ^= GD ; // 异或除法,被除数应该异或之后少一位}tst0 >>= 1; //位数减一,最高位降低一位GD >>= 1; //除数保持和被除数最高位对齐,相当于竖式除法左对齐}i=0;while(1) //转化为2进制输出,16进制数模2取余,移位 {b[i] = MD % 2;i++;MD /= 2;if(MD == 0 || i > 6)break;}}void main(){C8255_CON = 0x81; //8255初始化CRC_check(0x28D,0x35); //16进制while(1) //显示{display();delay(0x80);clear();}}七、实验心得实验指导书上写的还是很好懂,只是最初接触的时候确实感觉代码好多陌生,因为这个调用机制,变量基本上都是公有变量,直接在函数里面使用,赋值,在另一个函数里面接着用。

通信原理实验17 CRC码的编解码实验

通信原理实验17 CRC码的编解码实验

实验十七CRC码的编解码实验实验内容1. 熟悉CRC码编码实验。

2.熟悉CRC码译码实验。

一、实验目的1.加深对CRC码的理解2.掌握CRC码的编解码过程3. 学习通过CPLD编程实现CRC码编译码实验二、实验电路工作原理在实际的基带传输系统中,并不是所有码字都能在信道中传输。

例如,含有直流和低频成分的基带信号就不适宜在信道中传输,因为它有可能造成信号严重畸变。

同时,一般基带传输系统都从接收到的基带信号流中提取收定时信号,而收定时信号却又依赖于传输的码型,如果码型出现长时间的连“0”或连“1”符号,则基带信号可能会长时间的出现0电位。

从而使收定时恢复系统难以保证收定时信号的准确性。

实际的基带传输系统还可能提出其它要求,因而对基带信号也存在各种可能的要求。

归纳起来,对传输用的基带信号的主要要求有两点:①对各种代码的要求,期望将原始信息的符号编制成适合于传输用的码型,②对所传码型的电波波形要求,期望电波波形适宜于在信道中传输。

前一问题称为传输码型选择,后一问题称为基带脉冲的选择。

这是两个既有独立性又有联系的问题,也是基带传输原理中十分重要的两个问题。

传输码(又称线路码)的结构将取决于实际信道特性和系统工作的条件。

在较为复杂的基带传输系统中,传输码的结构应具有下列主要特性:①能从其相应的基带信号中获取定时信息;②相应的基带信号无直流成分和只有很小的低频成分;③不受信息源统计特性的影响,即能适应于信息源的变化;④尽可能地提高传输码型的传输效率;⑤具有内在的检错能力,等等。

1.CRC简介91CRC 又称循环冗余校验码,属于循环码的一种,在计算机通信和移动通信中广为应用。

它能够检测出如下错误:(1) 突发长度≤n-k 的突发错误;(2) 大部分突发长度=n-k+1的错误,其中不可检测的这类错误只占(1)2n k ---;(3) 大部分突发长度〉n-k+1的错误,不可检测的这类错误只占()2n k --;(4) 所有与许用码组码距≤min d -1的错误;(5) 所有基数个随机错误。

冗余校验(CRC)原理与编码方法

冗余校验(CRC)原理与编码方法

冗余校验(CRC)原理与编码方法关键词:通讯冗余校验编码摘要:通信的目的是要把信息及时可靠地传送给对方,因此要求一个通信系统传输消息必须可靠与快速,在数字通信系统中可靠与快速往往是一对矛盾。

为了解决可靠性,通信系统都采用了差错控制。

本文着重介绍了循环冗余校验CRC(Cyclic Redundancy Check)的差错控制原理及其编码方法。

1、概述在数字通信系统中实现检错功能的差错控制方法很多,传统的有:奇偶校验、重复码校验、恒比码校验、行列冗余码校验等,这些方法都是增加数据的冗余量,将校验码和数据一起发送到接受端。

接受端对接受到的数据进行相同校验,再将得到的校验码和接受到的校验码比较,如果二者一致则认为传输正确。

但这些方法都有各自的缺点,误判的概率比较高。

循环冗余校验CRC(Cyclic Redundancy Check)是由分组线性码的分支而来,其主要应用是二元码组。

编码简单且误判概率很低,在通信系统中得到了广泛的应用。

下面重点介绍了CRC校验的原理及其算法。

2、冗余校验标准分类循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。

它是利用多项式除法及余数的原理来作错误侦测(Error Detecting)的。

它将要发送的数据比特序列当作一个多项式f(x)的系数,发送时用双方预先约定的生成多项式G(x)去除,求得一个余数多项式,将余数多项式加到数据多项式之后发送到接收端,接收端同样用G(x)去除接收到的数据,进行计算,然后把计算结果和实际接收到的余数多项式数据进行比较,相同的话表示传输正确。

CRC校验检错能力强,容易实现,是目前应用最广的检错码编码方式之一。

在国际标准中,根据生成多项式G(x)的不同,CRC又可分为以下几种标准:①CRC-4码:G(X)=X4+X+1②CRC-12码:G(X)=X12+X11+X3+X2+X+1③CRC-16码:G(X)=X16+X15+X2+1④CRC-CCITT码:G(X)=X16+X12+X5+1⑤CRC-32码:G(x)=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1CRC-12码通常用来传送6-bit字符串。

CRC校验码编码实验

CRC校验码编码实验

实验四CRC校验码编码实验班级:电子C073 姓名:赵宣学号:075584一、实验目的1、复习C++语言基本编写方法,熟悉面向对象编程方法。

2、学习CRC编码基本流程, 学会调试循环冗余校验码编码程序。

3、根据给出资料,掌握CRC校验码的编码原理,重点掌握按字节(Byte)编码方法二、实验内容与原理(一)实验原理:1. CRC 校验码介绍CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个校验用的监督码(CRC 码)r 位,并附在信息后边,构成一个新的二进制码序列数共 (k+r) 位,最后发送出去。

在接收端,则根据信息码和CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。

16 位的CRC 码产生的规则是先将要发送的二进制序列数左移16 位(乘以216)后,再除以一个多项式,最后所得到的余数既是CRC 码。

求CRC 码所采用模2 加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。

接收方将接收到的二进制序列数(包括信息码和CRC 码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误。

2.按位计算CRC一个二进制序列数可以表示为求此二进制序列数的CRC 码时,先乘以216后(左移16位),再除以多项式G(X) ,所得的余数就是所要求的CRC 码。

可以设:其中Q n (X) 为整数, R n (X) 为16位二进制余数,将上式代入前式得:再设:其中Qn-1(X) 为整数, Rn-1(X) 为16位二进制余数,继续代入前式,多次迭代得到:根据CRC 的定义,很显然,十六位二进制数R0(X) 即是要求的CRC 码。

3.按字节计算CRC对于一个二进制序列数可以按字节表示为下式,其中Bn(X) 为一个字节(共8位):求此二进制序列数的CRC码时,先乘以216后(左移16位),再除以多项式G(X),所得的余数即是所要求的CRC 码。

CRC编码模块设计实验报告

CRC编码模块设计实验报告

湖南科技大学《数字系统设计》综合实验报告实验题目:CRC编码模块设计班级:学号:姓名:日期:一:题目功能分析;设计一个在数字传输中常用的校验、纠错模块,CRC循环冗余校验模块设计简介:循环冗余校验(CRC)是一种根据网络数据封包或电脑档案等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。

生成的数字在传输或者储存之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。

而且CRC码是目前通信系统中最常用的一种差错控制编码,利用其进行检错的过程可简单描述为:在发送端根据要传送的二进制码序列,以一定的规则产生一个校验用的监督码,附在原始信息后边,构成一个新的二进制码序列数,然后发送出去。

在接收端根据信息码和CRC 码之间所遵循的规则进行检验,一旦传输过程中发生差错,则信息码元与监督码元之间的关系遭到破坏,从而可以发现错误,乃至纠正错误。

CRC实验原理: CRC检验原理实际上就是在一个p位二位进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。

如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。

因此,通过检查这一关系,就可以实现对数据正确性的检验。

本设计需要完成16位信息和5位CRC校验码发送、接收,其功能实现为:采用平台上的A、B两组开关输入16位二进制数,输出为X、Y、Z三组发光二极管,同时要求6个数码管显示其相对应的16进制编码结果。

二:总模块划分;由两个模块构成:CRC校验生成模块(发送)和CRC校验检错模块(接收),采用输入、输出否为并行的CRC校验生成方式。

(结构图)三:代码实现;VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity crc isport(clk :in std_logic;sdata:in std_logic_vector(15 downto 0);smg:out std_logic_vector(7 downto 0);led:out std_logic_vector(7 downto 0);error,hsend:out std_logic);end crc;architecture comm of crc isconstant multi_coef:std_logic_vector(5 downto 0):="110101";--signal sdata:std_logic_vector(15 downto 0):="1010001000100011";signal datacrco:std_logic_vector(23 downto 0);signal cnt:std_logic_vector(4 downto 0);signal dtemp:std_logic_vector(15 downto 0);signal sdatam:std_logic_vector(15 downto 0);signal rdtemp:std_logic_vector(15 downto 0);signal rdatacrc:std_logic_vector(20 downto 0);signal rcnt:std_logic_vector(4 downto 0);signal st:std_logic;signal rt:std_logic;signal cn:std_logic;signal state:integer range 0 to 8;signaltdata1,tdata2,tdata3,tdata4,tdata5,tdata6,data:std_logic_vector(3 downto 0);beginp1:process(clk)variable crcvar:std_logic_vector(5 downto 0);beginif clk'event and clk='1' thenif (st='0') thendtemp<=sdata;sdatam<=sdata;cnt<=(others=>'0');hsend<='0';st<='1';elsif(st='1'and cnt<11)thencnt<=cnt+1;if(dtemp(15)='1')thencrcvar:=dtemp(15 downto 10)xor multi_coef;dtemp<=crcvar(4 downto 0) & dtemp(5 downto 0) & '0'& '0'& '0'& '0'& '0';else dtemp<=dtemp(14 downto 0)&'0';end if;elsif(st='1'and cnt=11)thendatacrco<='0'& '0'& '0'&sdata&dtemp(15 downto 11);hsend<='1';cnt<=cnt+1;elsif(st='1' and cnt=11)thenhsend<='0';st<='0';end if;end if;end process p1;tdata1<=datacrco(23 downto 20);tdata2<=datacrco(19 downto 16);tdata3<=datacrco(15 downto 12);tdata4<=datacrco(11 downto 8);tdata5<=datacrco(7 downto 4);tdata6<=datacrco(3 downto 0);cn<='1';process(clk)beginif (clk'event and clk='1'and cn='1') then state<=state+1;end if;end process;process(data,state)begincase data iswhen "0000"=>smg<="10111111"; when "0001"=>smg<="10000110"; when "0010"=>smg<="11011011";when "0011"=>smg<="11001111";when "0100"=>smg<="11100110";when "0101"=>smg<="11101101";when "0110"=>smg<="11111101";when "0111"=>smg<="10000111";when "1000"=>smg<="11111111";when "1001"=>smg<="11101111";when "1010"=>smg<="11110111";when "1011"=>smg<="11011110";when "1100"=>smg<="10111001";when "1101"=>smg<="11111100";when "1110"=>smg<="11111001";when "1111"=>smg<="11110001";when others=>smg<="00000000";end case;end process;process(tdata1,tdata2,tdata3,tdata4,tdata5,tdata6,state) begincase state iswhen 1=>led<="11111110";data<=tdata1;when 2=>led<="11111101";data<=tdata2;when 3=>led<="11111011";data<=tdata3; when 4=>led<="11110111";data<=tdata4; when 5=>led<="11101111";data<=tdata5; when 6=>led<="11011111";data<=tdata6; when others=>led<="11111111";data<="1111"; end case;end process;end comm;四:仿真与实验结果;首先在工程下VHDL file编写上述代码,编写完成,点击电脑上的complication图标,然后再点击assignments,选择pins选项,按照所编程程序的要求,完成对输入输出引脚的绑定,在点击仿真模拟的图标,将程序仿真模拟,在实验平台上显示结果如上图。

CRC校验实验报告

CRC校验实验报告

实验三CRC校验一、CRC校验码的基本原理编码过程:CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为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 将y(x)的尾部加上校验码,得到二进制多项式。

就是包含了CRC校验码的待发送字符串。

解码过程:从CRC的编码规则可以看出,CRC编码实际上是将代发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式所以解码时可以用接收到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。

许多CRC的硬件解码电路就是按这种方式进行检错的。

同时,可以看做是由t(x)和CRC校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。

解码过程示例:运行结果:附录(实现代码):using System;using System.Collections.Generic;using System.Text;namespace CRC{public abstract class Change{/// <summary>/// 字节数组转进制/// </summary>/// <param name="bytes">字节数组</param>/// <param name="b1">字节数组长度</param>public static string ByteToHex(byte[] bytes, int b1){string returnStr = "";if (bytes != null){for (int i = 0; i < b1; i++){returnStr += bytes[i].ToString("x2").ToUpper();} }return returnStr;}/// <summary>/// 16进制转字节数组/// </summary>/// <param name="hexStr">16进制数</param>public static byte[] HexToByte(string hexStr){hexStr = hexStr.Replace(" ", "");if ((hexStr.Length % 2) != 0)hexStr += " ";//空格byte[] bytes = new byte[hexStr.Length / 2];for (int i = 0; i < bytes.Length; i++){bytes[i] = Convert.ToByte(hexStr.Substring(i * 2, 2), 16);} return bytes;}/// <summary>/// 字符串转进制/// </summary>/// <param name="str">字符串</param>/// <returns></returns>public static string StrToHex(string str){if (str == "") return "";byte[] bTemp = System.Text.Encoding.Default.GetBytes(str);return ByteToHex(bTemp, bTemp.Length);}/// <summary>/// 16进制转字符串/// </summary>/// <param name="str">16进制</param>/// <returns></returns>public static string HexToStr(string str){byte[] bytes = new byte[str.Length];bytes = HexToByte(str);return Encoding.Default.GetString(bytes);}}}namespace CRC{//哈夫曼树150// 结点类Node的定义如下:public class Node{private int weight; //结点权值private int lChild; //左孩子结点private int rChild; //右孩子结点private int parent; //父结点//结点权值属性public int Weight{get{return weight;}set{weight = value;}}//左孩子结点属性public int LChild{get{return lChild;}set{lChild = value;}}//右孩子结点属性public int RChild{get{ return rChild;}set { rChild = value; } } //父结点属性public int Parent{ get{ return parent; }set {parent = value; } } //构造器public Node(){weight = 0;lChild = -1;rChild = -1; parent = -1; }//构造器public Node(int w, int lc, int rc, int p){weight = w;lChild = lc;rChild = rc;parent = p;}}public class HuffmanTree{private List<Node> data = new List<Node>(); //结点数组private int leafNum; //叶子结点数目//索引器public Node this[int index]{get{return data[index];}set{data[index] = value;}}//叶子结点数目属性public int LeafNumpublic int LeafNum{get{ return leafNum;set{ leafNum = value; } }//构造器public HuffmanTree(){ }public HuffmanTree(List<NumKindchar> m_NumKind){leafNum = m_NumKind.Count;for (int j = 0; j < 2 * m_NumKind.Count - 1; j++)//n中字符共需要2n-1个节点{Node databuff = new Node();if (j < this.leafNum){databuff.Weight = m_NumKind[j].num; }data.Add(databuff);//每创建一个节点将节点加入节点数组data当中} }public List<Node> Create(){int max1, max2, tmp1, tmp2;//处理n个叶子结点,建立哈夫曼树for (int i = 0; i < this.leafNum - 1; ++i){ max1 = max2 = Int32.MaxValue;tmp1 = tmp2 = 0;//在全部结点中找权值最小的两个结点for (int j = 0; j < this.leafNum + i; ++j){ if ((data[j].Weight < max1) && (data[j].Parent == -1)){ max2 = max1;tmp2 = tmp1;tmp1 = j;max1 = data[j].Weight; }else if ((data[j].Weight < max2) && (data[j].Parent == -1)){ max2 = data[j].Weight;tmp2 = j;} }data[tmp1].Parent = this.leafNum + i;data[tmp2].Parent = this.leafNum + i;data[this.leafNum + i].Weight = data[tmp1].Weight + data[tmp2].Weight;data[this.leafNum + i].LChild = tmp1;data[this.leafNum + i].RChild = tmp2;}return data; }}public class NumKindchar{ public char letter { get; set; }//字符public int num { get; set; }//字符出现的次数public List<bool> huffmancode { get; set; }//字符对应的huffman编码}public class codeChar{public char numChar { get; set; }public string codeCharater { get; set; }}}。

12CRC编解码实验

12CRC编解码实验

实验二 CRC (循环冗余校验码)编解码实验一、实验目的1、掌握CRC 码的编解码原理。

2、掌握CRC 码的软件仿真方法。

3、掌握CRC 码的硬件仿真方法。

4、掌握CRC 码的硬件设计方法。

二、预习要求1、掌握CRC 码的编解码原理和方法。

2、熟悉matlab 的应用和仿真方法。

3、熟悉Quatus 的应用和FPGA 的开发方法。

三、实验原理CRC 码是一种循环码,有着极强的检错能力,在计算机通信和移动通信种广为应用。

定义变量m(x)为信息码元;T(x)为编码码组;g(x)为生成多项式。

CRC 码的编码步骤如下:(1) 用n k x - 乘m(x)。

这一运算实际上就是把信息码后附加上(n-k)个“0”。

例如,信息码为110,它相当m(x)=2x x +。

当n-k=7-3=4时,4265()()n k x m x x x x x x -=+=+,相当于1100000。

(2) 用g(x)除()n k x m x -,得到商Q(x)和余式r(x),即()()()()()n kxm x r x Q x g x g x -=+例如,若选定42()1g x x x x =+++,则65224242()1(1)()11n kxm x x xx xx g x xx x xxx -++==+++++++++相当于11000001011111011110111=+(3)编码码组T(x)为:()()()n kT x x m x r x -=+在上例中,T(x)=1100000+101=1100101。

上述几个步骤用硬件实现时,可以由除法电路来实现。

除法电路的主体由一些移位寄存器和模2加法器组成。

例如,上述(7,3)循环码的编码器组成如下图所示。

图 1 (7,3)循环码编码器图1中有四级移存器,分别用a,b,c,d 表示。

另外有一单刀双掷开关S 。

当信息位输入时,开关S 倒向下,输入信息码一方面送入除法器进行运算,另一方面直接输出。

CRC校验实验

CRC校验实验

实验一、CRC校验实验一、实验目的1.熟悉西门子S7-200编程软件SETP7-Micro/WIN SP6的编程和调试方法。

2.掌握CRC校验的原理和在S7-200 PLC中的实现方法。

二、实验设备计算机、西门子S7-200 PLC、RS485编程下载线。

三、实验原理(一)CRC校验基本原理校验码的具体生成过程为:假设被传输的数据流为BYTE[n]BYTE[n-1].... BYTE[1]BYTE[0],将此数据流看成系数为0或1的多项式M(x)。

收发双方约定一个生成多项式G(x)。

本实验中,多项式设为G(x)= X8+X7+X2+1。

在发送端将M(x)所对应的位串左移8位后按模2除法除以G(x)所对应的位串,余数为8位,称为CRC校验码,将CRC校验码附加在被传输的数据流后边,则被传输的带校验码的数据流为BYTE[n]BYTE[n-1]....BYTE[1]BYTE[0]CRC。

在接收端,也进行同样的除法过程,如果接收端的除法结果不为0,则表明数据传输产生了差错,数据接收端自动请求重发,实现纠错。

(二)CRC校验码生成方法和步骤1. 将被传输的数据流左移8位(共n+2个字节),高8位BYTE[n])放入一个长度为8的寄存器。

2. 将寄存器左移1位(寄存器的最低位从下一个字节获得),如果移出位为1,将寄存器中的值与生成多项式G(x)的简记式进行异或运算,运算结果存回寄存器中。

G(x)对应的位串共9位,其最高位总是1,G(x)的简记式为其后8位,为10000101。

如果移出位为0,则仅将寄存器左移1位(寄存器的最低位从下一个字节获得)。

3. 重复第2步,直到扩展后的数据流(n+2个字节)全部移入寄存器。

4. 寄存器中的值则为CRC校验码。

四、实验内容1.根据CRC校验码生成原理编写一段程序,调试并要求能够实现正确计算出任意长度数据串的CRC校验码。

七、实验源程序Network 1LD SM0.0MOVW VW301,VW400 //被传输数据高16位送入16位寄存器MOVW 16#8005,VW100 //VW100中存入生成多项式MOVD &VB303,AC1 //被传输数据下一个字节的地址存入AC1MOVB *AC1,VB20 //VB303中的被传输数据第3个字节存入VB20MOVB VB300,VB10//VB300输数据流的字节数送入VB10Network 2LD SM0.0FOR VW2,1,VW9 //外循环次数为被传输数据的字节数VB10Network 3LD SM0.0FOR VW0,1,8 //内循环次数为8位Network 4LD SM0.0SHRB V20.7,V401.0,16 //将V303.7移入V401.0LD SM1.1XORW VW100,VW400Network 5LD SM0.0SLB VB20.1 //将VB20左移一位Network 6NEXTNetwork 7LD SM0.0INCB AC1MOVB *AC1,VB20 Network 8NEXT。

实验报告 06050401

实验报告 06050401

计算机网络实验报告06050401 吴嘉宝实验一 CRC校验的编程实现一、上机目的:CRC校验是计算机网络差错编码中应用广泛的一种编码方式,CRC校验编、译码比较简单,而且编码和译码可用具有反馈的移位寄存器来实现。

二、CRC校验原理:循环冗余码校验,英文名称为Cyclical Redundancy Check,简称CRC。

它是利用除法及余数的原理来做错误侦测的。

实际应用时,发送装置计算出CRC并与随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误,需重发。

三、CRC程序设计计算过程:1、设置CRC寄存器,并赋值FFFF(hex)。

2、将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。

3、CRC寄存器向右移一位,MSB补零,移出并检查LSB。

4、如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

5、重复第3与第4步直到8次移位全部完成。

此时一个8-bit数据处理完成。

6、重复第2至第5步直到所有数据全部处理完成。

7、最终CRC寄存器的内容即为CRC值。

四、流程图如下:实验二、常用网络操作命令一、上机目的:应用课堂教学中讲到的命令和操作过程,在机房中动手操作,从而掌握网络环境下常用命令以及典型应用的操作方法。

二、上机操作:在不同操作系统下的网络操作命令不尽相同,以下描述的操作命令都是在Windows的命令行方式下实现的。

以下网络操作命令在命令行窗口执行,打开命令行窗口的方法如下:在Windows平台下点击“开始”“运行”,然后输入“cmd”,开启命令行窗口。

1、ping命令(1)利用ping命令实现内部回环测试利用本地回送地址127.0.0.1测试本地该计算机Reply from 219.224.33.114: bytes=32 time<1ms TTL=128Reply from 219.224.33.114: bytes=32 time<1ms TTL=128Reply from 219.224.33.114: bytes=32 time<1ms TTL=128Reply from 219.224.33.114: bytes=32 time<1ms TTL=128Ping statistics for 219.224.33.114:Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum = 0ms, Average = 0ms(2)测主机连通性C:\Program Files\Microsoft Visual Studio 8\VC>ping 219.224.33.113 Pinging 219.224.33.113 with 32 bytes of data:Reply from 219.224.33.113: bytes=32 time<1ms TTL=128Reply from 219.224.33.113: bytes=32 time<1ms TTL=128Reply from 219.224.33.113: bytes=32 time<1ms TTL=128Reply from 219.224.33.113: bytes=32 time<1ms TTL=128Ping statistics for 219.224.33.113:Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum = 0ms, Average = 0ms(3)测试局域网最大分组长度C:\Program Files\Microsoft Visual Studio 8\VC>ping 219.224.33.114 -l 1473 -fPinging 219.224.33.114 with 1472 bytes of data:Reply from 219.224.33.114: bytes=1472 time<1ms TTL=128Reply from 219.224.33.114: bytes=1472 time<1ms TTL=128Reply from 219.224.33.114: bytes=1472 time<1ms TTL=128Reply from 219.224.33.114: bytes=1472 time<1ms TTL=128Ping statistics for 219.224.33.114:Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum = 0ms, Average = 0msC:\Program Files\Microsoft Visual Studio 8\VC>ping 219.224.33.114 -l 1473 -fPinging 219.224.33.114 with 1473 bytes of data:Packet needs to be fragmented but DF set.Packet needs to be fragmented but DF set.Packet needs to be fragmented but DF set.Packet needs to be fragmented but DF set.Ping statistics for 219.224.33.114:Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),2、ipconfig命令获取本机MAC地址的方法C:\Program Files\Microsoft Visual Studio 8\VC>ipconfig/allWindows IP ConfigurationHost Name . . . . . . . . . . . . : 114Primary Dns Suffix . . . . . . . :Node Type . . . . . . . . . . . . : UnknownIP Routing Enabled. . . . . . . . : NoWINS Proxy Enabled. . . . . . . . : NoEthernet adapter 本地连接:Connection-specific DNS Suffix . :Description . . . . . . . . . . . : Intel(R) 82566DM Gigabit Network ConnectionPhysical Address. . . . . . . . . : 00-1A-6B-4C-28-A4Dhcp Enabled. . . . . . . . . . . : NoIP Address. . . . . . . . . . . . : 219.224.33.114Subnet Mask . . . . . . . . . . . : 255.255.255.0Default Gateway . . . . . . . . . : 219.224.33.254DNS Servers . . . . . . . . . . . : 211.71.97.27211.71.97.673、用arp命令查看MAC地址和IP地址的对应关系在windows平台下命令窗口中输入arp –aC:\Program Files\Microsoft Visual Studio 8\VC>arp -aInterface: 219.224.33.114 --- 0x2Internet Address Physical Address Type219.224.33.103 00-1a-6b-4c-2d-20 dynamic219.224.33.105 00-1a-6b-4c-2c-4c dynamic219.224.33.106 00-1a-6b-4c-2c-06 dynamic219.224.33.113 00-1a-6b-4c-2d-ae dynamic219.224.33.114 00-1a-6b-4c-2a-18 dynamic219.224.33.119 00-1a-6b-4c-26-aa dynamic219.224.33.148 00-1a-6b-4c-2c-d8 dynamic219.224.33.163 00-1a-6b-4c-11-d0 dynamicPinging 219.224.33.114 with 32 bytes of data:Reply from 219.224.33.114: bytes=32 time<1ms TTL=128Reply from 219.224.33.114: bytes=32 time<1ms TTL=128Reply from 219.224.33.114: bytes=32 time<1ms TTL=128Reply from 219.224.33.114: bytes=32 time<1ms TTL=128Ping statistics for 219.224.33.114:Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum = 0ms, Average = 0ms4、tracert命令测试到达目的主机所经过的路由在windows平台下命令窗口中输入tracert C:\Program Files\Microsoft Visual Studio 8\VC>arp -aInterface: 219.224.33.114 --- 0x2Internet Address Physical Address Type219.224.33.102 00-1a-6b-4c-11-04 dynamic219.224.33.105 00-1a-6b-4c-2c-4c dynamic219.224.33.106 00-1a-6b-4c-2c-06 dynamic219.224.33.118 00-1a-6b-4c-2a-18 dynamic219.224.33.119 00-1a-6b-4c-26-aa dynamic219.224.33.163 00-1a-6b-4c-11-d0 dynamic219.224.33.119 00-1a-6b-4c-26-aa dynamic219.224.33.163 00-1a-6b-4c-11-d0 dynamicC:\Program Files\Microsoft Visual Studio 8\VC>tracert 219.224.33.114 Tracing route to 219.224.33.114 over a maximum of 30 hops1 <1 ms <1 ms <1 ms 219.224.33.114Trace complete.5、nslookup解析域名在windows平台下命令窗口中输入nslookupC:\Program Files\Microsoft Visual Studio 8\VC>nslookupDNS request timed out.timeout was 2 seconds.*** Can't find server name for address 211.71.97.27: Timed outDNS request timed out.timeout was 2 seconds.*** Can't find server name for address 211.71.97.67: Timed out*** Default servers are not availableDefault Server: UnKnownAddress: 211.71.97.27> 219.224.33.114Server: UnKnownAddress: 211.71.97.27DNS request timed out.timeout was 2 seconds.*** Request to UnKnown timed-out>【思考】(1) TTL是Time To Live 缩写,意思是生存时间(2)拔掉网线后出现情况:Ping请求找不到主机查询的网址(3)通过ping命令找到几个自己感兴趣的网站的最大帧长度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四CRC校验码编码实验班级:电子C073 姓名:赵宣学号:075584一、实验目的1、复习C++语言基本编写方法,熟悉面向对象编程方法。

2、学习CRC编码基本流程, 学会调试循环冗余校验码编码程序。

3、根据给出资料,掌握CRC校验码的编码原理,重点掌握按字节(Byte)编码方法二、实验内容与原理(一)实验原理:1. CRC 校验码介绍CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个校验用的监督码(CRC 码)r 位,并附在信息后边,构成一个新的二进制码序列数共 (k+r) 位,最后发送出去。

在接收端,则根据信息码和CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。

16 位的CRC 码产生的规则是先将要发送的二进制序列数左移16 位(乘以216)后,再除以一个多项式,最后所得到的余数既是CRC 码。

求CRC 码所采用模2 加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。

接收方将接收到的二进制序列数(包括信息码和CRC 码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误。

2.按位计算CRC一个二进制序列数可以表示为求此二进制序列数的CRC 码时,先乘以216后(左移16位),再除以多项式G(X) ,所得的余数就是所要求的CRC 码。

可以设:其中Q n (X) 为整数, R n (X) 为16位二进制余数,将上式代入前式得:再设:其中Qn-1(X) 为整数, Rn-1(X) 为16位二进制余数,继续代入前式,多次迭代得到:根据CRC 的定义,很显然,十六位二进制数R0(X) 即是要求的CRC 码。

3.按字节计算CRC对于一个二进制序列数可以按字节表示为下式,其中Bn(X) 为一个字节(共8位):求此二进制序列数的CRC码时,先乘以216后(左移16位),再除以多项式G(X),所得的余数即是所要求的CRC 码。

可以设:其中Qn(X) 为整数, Rn(X) 为16位二进制余数,将上式代入前式得:由于:其中RnH8(X) 是Rn(X)的高八位, RnL8(X)是Rn(X)的低八位,代入前式得到:再设:其中Qn-1(X ) 为整数, Rn-1(X ) 为16位二进制余数,继续代入前式,多次迭代得到:显然,十六位二进制数R0(X)即是要求的CRC码。

(二)实验内容:1.根据实验原理掌握CRC 校验码编码/解码基本流程。

2.在C++编译器下能够调试编码算法每一个步骤,重点掌握按字节编码的过程。

三、实验仪器、设备1.计算机-系统最低配置256M 内存、P4 CPU。

2.C++ 编程软件-Visual C++ 7.0 (Microsoft Visual Studio 2003)Visual C++ 8.0 (Microsoft Visual Studio 2005)四、实验步骤项目文件建立步骤同实验二,下面列出对给定字符串CRC 校验主要步骤:步骤1:从主函数入口输入一个字符串,并且确定按字节32 位CRC 校验编码,编码多项式采用CCITT 标准形式多项式。

步骤2:调用编码函数,依次读入字符串每个自己,进行模2 除法运算。

步骤3:将原来字符串左移32 位,将除法最后的余式追加到字符串的后32 位中去,得到该字符串CRC 校验编码结果。

步骤4:如果要解码,首先确认编码多项式,然后将接收字符串除以编码多项式。

如果能够整除,说明字符串在传输或存储中没有发生错误;否则,表明字符串在传输或存储中产生错误,导致CRC 校验失败。

五、实验数据及结果分析:#include "stdafx.h"#include "CRC32.h"void SlowCrc::PutByte (unsigned char byte) {unsigned char mask = 0x80; // leftmost bit for (int j = 0; j < 8; ++j){PutBit ((byte & mask) != 0);mask >>= 1;}}void SlowCrc::PutBit (bool bit) {std::cout << bit? "1": "0";bool topBit = (_register & 0x80000000) != 0;// shift bit into register from the right _register <<= 1;_register ^= (bit? 0x1: 0x0); // OR or XOR, same resultif (topBit){// XOR the 32-bits of the key.// The implicit high bit of the 33-bit key conceptually// clears the topBit shifted out of the试验四CRC校验码编码实验试验报告register_register ^= _key;}}int _tmain(int argc, _TCHAR* argv[]) {Crc::Type const ethernetKey = 0x04c11db7; SlowCrc slowCrc (ethernetKey);// calculate R in: M (x) * x^32 = Q (x) * K (x) + R (x)std::string msg ("Harry had a little lamp");size_t origLen = msg.length ();// "Multiply" message by x^32msg.resize (origLen + sizeof (Crc::Type)); for (size_t i = 0; i < msg.length (); ++i) {std::cout << " ";slowCrc.PutByte (msg [i]);}std::cout << "\n<- ";Crc::Type crc = slowCrc.Done ();std::cout << "\n0x" << std::hex << crc << std::endl;// Now test consistency // M (x) * x^32 + R (x)int shift = 32;for (int j = 0; j < sizeof (SlowCrc::Type); ++j){shift -= 8;msg [origLen + j]= static_cast<unsigned char> (crc >> shift);}// Divide it by K (x) --> should be divisiblefor (i = 0; i < msg.length (); ++i) {std::cout << " ";slowCrc.PutByte (msg [i]);}std::cout << "\n<- ";crc = slowCrc.Done ();std::cout << "\n0x" << std::hex << crc << std::endl;assert (crc == 0);return 0;六、思考题1.掌握按字节编码的过程,试着写出CRC 校验编码的Matlab 程序?%main programclear all;input=[1 1 0 0]CRC_Number=[3 8 12 16];for crc_index = 1:size(CRC_Number,2)crc_no = CRC_Number(crc_index)output = crc_add(input, crc_no)[output_after_check, indicate] =crc_check(output,crc_no)endfunction [ output, indicate] = crc_check( input, crc_no )% the function is proposed for deleting crc bits from the input sequencen = size(input,2);generator = zeros(1,crc_no+1);output = zeros(1,n-crc_no);switch crc_nocase 3generator = [1 0 1 1];case 8generator = [1 1 0 0 1 1 0 1 1]; %D^8+D^7+D^4+D^3+D+1 case 12generator = [1 1 0 0 0 0 0 0 0 1 1 1 1]; %D^12+D^11+D^3+D^2+D+1case 16generator = [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1]; %D^16+D^12+D^5+1case 24generator = [1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1]; %D^24+D^23+d^6+D^5+D+1otherwisefprintf('\nPlease the number of crc bits should be 8 12 16 24\n');endoutput = input(1:n-crc_no);for ii = 1:n-crc_noif(input(1) == 1)input(1:crc_no+1) = mod((input(1:crc_no+1)+generator),2);endinput = [input(2:end) input(1)];endif sum(input) == 0试验四CRC校验码编码实验试验报告indicate = 0;elseindicate = 1;endfunction [ output ] = crc_add( input, crc_no )% the function is proposed for adding crc bits to the input sequencek = size(input,2);generator = zeros(1,crc_no+1);output = zeros(1,k+crc_no);switch crc_nocase 3generator = [1 0 1 1];case 8generator = [1 1 0 0 1 1 0 1 1]; %D^8+D^7+D^4+D^3+D+1 case 12generator = [1 1 0 0 0 0 0 0 0 1 1 1 1]; %D^12+D^11+D^3+D^2+D+1case 16 generator = [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1]; %D^16+D^12+D^5+1case 24generator = [1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1]; %D^24+D^23+d^6+D^5+D+1otherwisefprintf('\nPlease the number of crc bits should be 8 12 16 24\n');endoutput(1:k)=input;for ii = 1:kif(output(1) == 1)output(1:crc_no+1) = mod((output(1:crc_no+1)+generator),2);endoutput = [output(2:end) output(1)];endoutput = [input output(1:crc_no)];2.如何设计FPGA 实现CRC 校验计算?32位并行数据CRC - 16校验码的FPGA实现表32位CRC - 16编码器的端口说明clk input 系统时钟crc_rset input CRC生成器复位sdata input 输入数据crc_out output 输出CRC校验码其中VHDL代码如下:L IBRARY IEEE;USE IEEE. STD_LOGIC_1164. ALL;ENTITY CRC16 ISPORT ( sdata: IN STD_LOGIC_VECTOR (31 DOWNTO 0) ;clk: IN STD_LOGIC;crc_rset: IN STD_LOGIC;crc_out: OUT STD_LOGIC_VECTOR (15 DOWNTO 0) ) ;END CRC16;ARCH ITECTURE th OF CRC16 ISSIGNAL D: STD_LOGIC_VECTOR (31 DOWNTO 0) ;SIGNAL R, crc_temp: STD_LOGIC_VECTOR (15 DOWNTO 0) ;BEGIND < = sdata;PROCESS( clk, crc_in)BEGINIF crc_in =‘1’THEN R < = (OTHERS = >‘0’) ;ELSIF rising_edge ( clk) THENcrc_temp (0) < =D (31) XOR D (30) XOR D (27) XOR D (26) XOR D ( 25) XOR D ( 24) XOR D ( 23) XORD (22) XOR D (21) XOR D (20) XOR D (19) XOR D (18) XOR D ( 17) XOR D ( 16) XORD (15) XOR D (13) XOR D ( 12) XOR D ( 11) XOR D ( 10 ) XOR D ( 9) XOR D ( 8) XORD (7) XOR D (6) XOR D (5) XOR D (4) XOR D (3) XOR D (2) XOR D (1) XOR D (0) XORR (0) XOR R (1) XOR R (2) XOR R (3) XOR R (4) XOR R (5) XOR R (6) XOR R (7) XORR (8) XOR R (9) XOR R (10) XOR R (11) XOR R (14) XOR R (15) ;crc_temp (1) < =D (31) XOR D (28) XOR D (27) XOR D ( 26) XOR D ( 25) XOR D ( 24) XOR D ( 23) XOR D (22) XOR D (21) XOR D (20) XOR D (19) XOR D (18) XOR D ( 17) XOR D ( 16) XORD (14) XOR D (13) XOR D ( 12) XOR D ( 11) XOR D ( 10 ) XOR D ( 9) XOR D ( 8) XORD (7) XOR D (6) XOR D (5) XOR D (4) XOR D (3) XOR D (2) XOR D (1) XOR R (0) XORR (1) XOR R (2) XOR R (3) XOR R (4) XOR R (5) XOR R (6) XOR R (7) XOR R (8) XORR (9) XOR R (10) XOR R (11) XOR R (12) XOR R (15) ;crc_temp (2) < =D (31) XOR D ( 30) XOR D ( 29) XOR D ( 28) XOR D ( 16) XOR D ( 14) XOR D ( 1) XOR D (0) XOR R (0) XOR R (12) XOR R (13) XOR R (14) XOR R (15) ;crc_temp (3) < =D (31) XOR D ( 30) XOR D ( 29) XOR D (17) XOR D (15) XOR D ( 2) XOR D (1) XORR (1) XOR R (13) XOR R (14) XOR R (15) ;crc_temp (4) < =D (31) XOR D (30) XOR D (18) XOR D (16) XOR D (3) XOR D (2) XOR R (0) XOR R (2) XOR R (14) XOR R (15) ;crc_temp (5) < = D ( 31) XOR D ( 19) XOR D ( 17 ) XOR D ( 4 ) XOR D ( 3 ) XOR R ( 1 ) XOR R ( 3 ) XOR R (15) ;crc_temp (6) < =D (20) XOR D (18) XOR D (5) XOR D (4) XOR R (2) XOR R (4) ;crc_temp (7) < =D (21) XOR D (19) XOR D (6) XOR D (5) XOR R (3) XOR R (5) ;crc_temp (8) < =D (22) XOR D (20) XOR D (7) XOR D (6) XOR R (4) XOR R (6) ;crc_temp (9) < =D (23) XOR D (21) XOR D (8) XOR D (7) XOR R (5) XOR R (7) ;crc_temp (10) < =D (24) XOR D (22) XOR D (9) XOR D (8) XOR R (6) XOR R (8) ;crc_temp (11) < =D (25) XOR D (23) XOR D (10) XOR D (9) XOR R (7) XOR R (9) ;crc_temp (12) < =D (26) XOR D (24) XOR D (11) XOR D (10) XOR R (8) XOR R (10) ;crc_temp (13) < =D (27) XOR D (25) XOR D (12) XOR D (11) XOR R (9) XOR R (11) ;crc_temp (14) < =D (28) XOR D (26) XOR D (13) XOR D (12) XOR R (10) XOR R (12) ;crc_temp (15) < =D (31) XOR D (30) XOR D (29) XOR D (26) XOR D (25) XOR D (24) XOR D (23) XOR D (22) XOR D (21) XOR D (20) XOR D (19) XOR D (18) XOR D (17) XOR D (16) XORD (15) XOR D (14) XOR D ( 12) XOR D ( 11) XOR D ( 10) XOR D ( 9) XOR D ( 8) XORD (7) XOR D (6) XOR D (5) XOR D ( 4) XOR D ( 3) XOR D ( 2) XOR D ( 1) XOR D ( 0)XOR R (0) XOR R (1) XOR R ( 2) XOR R ( 3) XOR R ( 4) XOR R ( 5) XOR R ( 6) XORR (7) XOR R (8) XOR R (9) XOR R (10) XOR R (13) XOR R (14) XOR R (15) ;END IF;END PROCESS;crc_out < = crc_temp;END th;七、实验总结通过本次试验我复习了C++语言基本编写方法,熟悉了面向对象编程方法。

相关文档
最新文档