循环冗余码的生成和验证.docx
- 文档编号:15765292
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:14
- 大小:80.30KB
循环冗余码的生成和验证.docx
《循环冗余码的生成和验证.docx》由会员分享,可在线阅读,更多相关《循环冗余码的生成和验证.docx(14页珍藏版)》请在冰点文库上搜索。
循环冗余码的生成和验证
一、题目
编写一个循环冗余码的生成和验证程序,并实现停等式ARQ,编程实现如何生成CRC码,传输,加入噪声,检错反馈,检测验证,信息重发的过程
二、概要设计
CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。
其实现步骤如下:
设待发送的数据块是m位的二进制多项式t(x),生成多项式为r阶的g(x)。
在数据块的末尾添加r个0,数据块的长度增加到m+r位,对应的二进制多项式为。
用生成多项式g(x)去除,求得余数为阶数为r-1的二进制多项式y(x)。
此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC校验码。
用以模2的方式减去y(x),得到二进制多项式。
就是包含了CRC校验码的待发送字符串。
CRC编码实际上是将代发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式,所以解码时可以用接受到的数据去除g(x),如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。
CRC码可以看做是由t(x)和CRC校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。
三、详细设计
如果生成码是10011
编码:
//reg是一个5bits的寄存器
把reg中的值置0.
把原始的数据后添加r个0.
While(数据未处理完)
Begin
If(reg首位是1)
reg=regXOR0011.
把reg中的值左移一位,读入一个新的数据并置于register的0bit的位置。
End
reg的后四位就是我们所要求的余数。
解码验错:
//reg是一个5bits的寄存器
把reg中的值置0.
把循环冗余码作为原始的数据
While(数据未处理完)
Begin
If(reg首位是1)
reg=regXOR0011.
把reg中的值左移一位,读入一个新的数据并置于register的0bit的位置。
Ifreg里的数据不为0则要求重发
Else把循环冗余码去掉后四位即是原始数据
End
四、流程图
五、运行结果
六、心得体会
通过此次编程,我更加了解了循环冗余码,循环冗余校验码又称为多项式码,是一种线性分组码,广泛应用在计算机网络和数据通信中。
CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,校验是从数据本身进行检查,它依靠某种数学上约定的形式进行检查,校验的结果是可靠或不可靠,如果可靠就对数据进行处理,如果不可靠,则要进行重发。
CRC校验由于实现简单,检错能力强,被广泛使用在各种数据校验应用中。
占用系统资源少,用软硬件均能实现,是进行数据传输差错检测地一种很好的手段。
此次编程,让我更加熟练的使用JAVA,并且让我知道了如何用JAVA来实现模2除法。
此次编程,收获颇丰。
七、源程序清单
importjava.util.Random;
importjava.awt.Event.*;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.awt.event.WindowListener;
importjava.awt.*;
importjavax.swing.*;
publicclasstextendsJFrameimplementsActionListener{
Stringstr1,ss;
intfla=0;
Panelp1=newPanel();
Panelp2=newPanel();
JLabellab1=newJLabel("输入");
JTextFieldt1=newJTextField(20);
JButtonbt1=newJButton("确定");
JButtonbt2=newJButton("发送");
JButtonbt3=newJButton("重输");
JTextAreat2=newJTextArea();
JTextAreat3=newJTextArea();
JScrollPanesp=newJScrollPane(t2,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JScrollPanesp1=newJScrollPane(t3,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
publict(){
super("编码");
p1.setLayout(newFlowLayout());
p1.add(lab1);
p1.add(t1);
add(p1,"North");
add(sp);
p2.setLayout(newGridLayout(1,3));
p2.add(bt1);
p2.add(bt2);
p2.add(bt3);
add(p2,"South");
bt1.addActionListener((ActionListener)this);
bt2.addActionListener((ActionListener)this);
bt3.addActionListener((ActionListener)this);
setSize(350,350);
setVisible(true);
addWindowListener(newwindowclose());
}
voidtt2(){
JFrameframe=newJFrame("解码");
setLayout(newGridLayout(0,1));
frame.add(sp1);
frame.setSize(350,350);
frame.setVisible(true);
addWindowListener(newwindowclose());
}
publicclasswindowcloseextendsWindowAdapter{
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
}
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals("确定"))
{
t1.setEditable(false);
}
if(e.getActionCommand().equals("发送"))
{if(fla==0)
tt2();
str1=t1.getText();
send();
}
if(e.getActionCommand().equals("重输"))
{
t1.setText("");
t2.setText("");
ss="";
t1.setEditable(true);
t3.setText("");
fla++;
}
}
privatevoidsend(){//数据处理求余发送
int[]dat;
int[]reg={1,0,0,1,1};//生成多项式
int[]res={0,0,0,0,0};//存放校验和
intlen1=str1.length();
char[]a1=str1.toCharArray();
t2.append("生成多项式是:
");
t3.append("生成多项式是:
");
for(inti=0;i t2.append(""+reg[i]); t3.append(""+reg[i]); } t2.append("\n"); t3.append("\n"); for(inti=0;i Stringstr=Integer.toBinaryString(a1[i]); intlen=str.length(); Strings1="",s2; dat=newint[len+4]; for(intn=0;n dat[n]=0; } char[]a2=str.toCharArray(); for(intn=0;n Strings=String.valueOf(a2[n]); dat[n]=Integer.parseInt(s); } for(intk=0;k<5;k++){ res[k]=dat[k]; } for(intk=0;k intj=0; if(res[j]==1){ for(j=0;j<4;j++){ res[j]=res[j+1]^reg[j+1]; } }else{ for(j=0;j<4;j++){ res[j]=res[j+1]; } } if(k res[4]=dat[k+5]; } } for(intk=0;k<4;k++){ s2=String.valueOf(res[k]); s1=s1.concat(s2); } t2.append("正在发送"+""+a1[i]+": "+str+s1+"\n"); intf=receive(str+s1);//接收方处理 if(f==1){ t2.append("发送成功! ! "+"\n"); }else{ t2.append("发送失败,重发···"+"\n"); i=i-1; } } } privateintreceive(Stringstr){//接收后校验返回信息 intflag,fg; int[]dat; int[]reg={1,0,0,1,1};//生成多项式 int[]res={0,0,0,0,0};//存放校验和 intlen=str.length(); dat=newint[len]; char[]a3=str.toCharArray(); for(intn=0;n Strings=String.valueOf(a3[n]); dat[n]=Integer.parseInt(s); } Randomrandom=newRandom();//产生随机错误 if(random.nextInt(9999)%20==0){ inti=random.nextInt(len-1); if(dat[i]==1) dat[i]=0; else dat[i]=1; } for(intk=0;k<5;k++){ res[k]=dat[k]; } for(intk=0;k intj=0; if(res[j]==1){ for(j=0;j<4;j++){ res[j]=res[j+1]^reg[j+1]; } }else{ for(j=0;j<4;j++){ res[j]=res[j+1]; } } if(k res[4]=dat[k+5]; } } for(fg=0;fg<4;fg++){ if(res[fg]! =0) break; } if(fg==4)//接收成功则在接受窗口显示 { t3.append("接收到: "+str+"\n"); flag=1; Stringch=str.substring(0,len-4); Integeraa=Integer.valueOf(ch,2); byte[]b=newbyte[1]; b[0]=(byte)aa.byteValue(); Strings1=newString(b); ss=ss+s1; t3.append(""+s1+"接收成功! ! "+"\n"); }else{//接受失败 Stringch=str.substring(0,len-4); Integeraa=Integer.valueOf(ch,2); byte[]b=newbyte[1]; b[0]=(byte)aa.byteValue(); Strings1=newString(b); flag=0; t3.append(""+s1+"接收失败,重传··."+"\n"); } returnflag; } publicstaticvoidmain(String[]args){ newt(); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 冗余 生成 验证