沈 阳 工 程 学 院
学 生 实 验 报 告
实验室名称:信息工程系软件实验室 实验课程名称:计算机网络 实验项目名称: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); String tem =endResult + \".\" +input2; try { fo.inputFile(tem); } catch (Exception e1) { e1.printStackTrace();} }else{ JOptionPane.showMessageDialog(jf, \"输入的生 成多项式不正确\错误\ } }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的主要代码如下所示。 public class Dealer { public boolean legal_binary(String str) { for (int i = 0; i < str.length(); i++) { } if (('0' != str.charAt(i)) && ('1' != str.charAt(i))) { return false; } return true; } public boolean legal_g_p(String str) { if ((('1' == str.charAt(0)) && ('1' == str.charAt(str.length() - 1)) && legal_binary(str))) { return true; } return false; } public StringBuffer montage(StringBuffer sb, int length) { for (int i = 0; i < length - 1; i++) { sb.append(\"0\");}return sb; }
public String get_cheksum(String data,String generateor_polynomial) { StringBuffer data_ = new StringBuffer(data.toString()); StringBuffer g_p_ = new StringBuffer(generateor_polynomial.toString()); int g_p_length = g_p_.length(); data_ = montage(data_, g_p_length); int d_length = data_.length(); for (int i = 0; i <= (d_length - g_p_length); i++) { } String cheksum = data_.toString(); String sub = data_.substring(0, g_p_length); StringBuffer temp = new StringBuffer(); if (sub.charAt(0) == '0') { data_ = new StringBuffer(data_.substring(1)); } else { for (int j = 1; j < g_p_length; j++) { if (sub.charAt(j) != g_p_.charAt(j)) { temp.append(\"1\"); } else { temp.append(\"0\");} } data_ = data_.replace(0, g_p_length, temp.toString());} return cheksum; } 3.文件读取类FileOperation.java import java.io.*; public class FileOperation { public void inputFile(String args)throws Exception{ DataOutputStream dos = new DataOutputStream(new FileOutputStream(\"d:\\\\open.txt\")); dos.writeBytes(args); } public String outputFile()throws Exception{ DataInputStream dis = new DataInputStream(new dos.close();
FileInputStream(\"d:\\\\open.txt\")); String str = dis.readLine(); return str; }} 4. 接收端界面GetMessage.java 5.程序入口Main.java的主要代码。 public class Main { public static void main(String[] args) { } } } MainFrame mf = new MainFrame(); 七.结果分析 运行结果如图1和图2所示。 图1. 发送方运行结果 图2.接收方运行结果
八.个人总结 CRC 校验的基本思想是:利用线性编码理论,在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个校验用的监督码(CRC 码)r 位,并附在信息后边,构成一个新的二进制码序列数共 (k+r) 位,最后发送出去。在接收端,则根据信息码和CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。 解题基本思路是:对于一个二进制序列,求其的CRC 码时,首先让其左移相应的位数,比如16 位的CRC 码,即让二进制序列左移16位。然后除以多项式G(X) ,所得的余数就是所要求的CRC 码。最后将其与二进制序列整合就是输出的序列。在验证接受是否有误时,把接收的序列再除以多项式G(X),如果余数为0则表示接受的无误则说明传输中无错误发生,否则说明传输有误。 经过本次关于CRC校验的实验,我们对CRC校验更深一层的理解并且重新温习了一下java的界面编程。虽然过程中遇到了许多困难,但是经过查询各种资料我们也都一一顺利的解决,最终完成了本次实验。 教 师 评 语 教师签字: 年 月 日
因篇幅问题不能全部显示,请点此查看更多更全内容