循环冗余码的生成和验证.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;it2.append(""+reg[i]);
t3.append(""+reg[i]);
}
t2.append("\n");
t3.append("\n");
for(inti=0;iStringstr=Integer.toBinaryString(a1[i]);
intlen=str.length();
Strings1="",s2;
dat=newint[len+4];
for(intn=0;ndat[n]=0;
}
char[]a2=str.toCharArray();
for(intn=0;nStrings=String.valueOf(a2[n]);
dat[n]=Integer.parseInt(s);
}
for(intk=0;k<5;k++){
res[k]=dat[k];
}
for(intk=0;kintj=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(kres[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;nStrings=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;kintj=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(kres[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();
}
}