循环冗余码的生成和验证Word文件下载.docx
《循环冗余码的生成和验证Word文件下载.docx》由会员分享,可在线阅读,更多相关《循环冗余码的生成和验证Word文件下载.docx(11页珍藏版)》请在冰点文库上搜索。
End
reg的后四位就是我们所要求的余数。
解码验错:
把循环冗余码作为原始的数据
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);
publicclasswindowcloseextendsWindowAdapter{
publicvoidwindowClosing(WindowEvente){
System.exit(0);
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals("
))
{
t1.setEditable(false);
{if(fla==0)
tt2();
str1=t1.getText();
send();
}
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<
reg.length;
i++){
t2.append("
"
+reg[i]);
t3.append("
\n"
for(inti=0;
i<
len1;
i++){
Stringstr=Integer.toBinaryString(a1[i]);
intlen=str.length();
Strings1="
s2;
dat=newint[len+4];
for(intn=0;
n<
len+4;
n++){
dat[n]=0;
}
char[]a2=str.toCharArray();
len;
Strings=String.valueOf(a2[n]);
dat[n]=Integer.parseInt(s);
for(intk=0;
k<
5;
k++){
res[k]=dat[k];
intj=0;
if(res[j]==1){
for(j=0;
j<
4;
j++){
res[j]=res[j+1]^reg[j+1];
}
}else{
res[j]=res[j+1];
}
if(k<
len-1){
res[4]=dat[k+5];
s2=String.valueOf(res[k]);
s1=s1.concat(s2);
正在发送"
+"
+a1[i]+"
:
+str+s1+"
intf=receive(str+s1);
//接收方处理
if(f==1){
t2.append("
发送成功!
!
发送失败,重发·
·
i=i-1;
}
privateintreceive(Stringstr){//接收后校验返回信息
intflag,fg;
intlen=str.length();
dat=newint[len];
char[]a3=str.toCharArray();
for(intn=0;
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;
res[k]=dat[k];
len-4;
k++){//校验
intj=0;
if(res[j]==1){
for(j=0;
res[j]=res[j+1]^reg[j+1];
}else{
res[j]=res[j+1];
if(k<
len-5){
res[4]=dat[k+5];
for(fg=0;
fg<
fg++){
if(res[fg]!
=0)
break;
if(fg==4)//接收成功则在接受窗口显示
接收到:
+str+"
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;
+s1+"
接收成功!
}else{//接受失败
flag=0;
+s1+"
接收失败,重传·
."
+"
returnflag;
publicstaticvoidmain(String[]args){
newt();
}