CRC校验 java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.*;
class WindowGrid extends JFrame implements ActionListener
{
 JButton buttonarray[]; //前部按钮
 JLabel  label[];
 JButton buttonzero;   //清零按钮
 JButton buttonrandom; //随机按钮
 JButton buttoncode;   //编码按钮
 int fx[];             //用来存储F(x)*x的K次方的0,1序列
 int gx[];             //用来存储G(x)0,1序列
 int save[];
    int sign;            
    int step;
 WindowGrid(String s)
 {
  super(s);
  Container contenetPane = this.getContentPane();
  GridLayout grid = new GridLayout(2,14);
  contenetPane.setLayout(grid);       //设置窗口的布局
  buttonarray = new JButton[16];
        label = new JLabel[13];
        buttonzero = new JButton("清零");
        buttonrandom = new JButton("随机");
        buttoncode = new JButton("编码");
        fx = new int[15];
        save = new int[15];
        gx = new int[15];
  for (int i = 0;i < 16;i++)          //为每个实例开辟内存空间
  { 
     buttonarray[i] = new JButton("0");
        buttonarray[i].addActionListener(this);
     contenetPane.add(buttonarray[i]);
  }
  for (int i = 0;i < 13;i++)
  {
   label[i] = new JLabel();
   contenetPane.add(label[i]);
  }
  label[0].setText("选定的多");
  label[1].setText("项式比特");
  label[2].setText("序列为:");
  label[3].setText("110101");
  label[10].setText("编码结果");
  sign  = 0;
  step  = 0;
  gx[0] = 1;
  gx[1] = 1;
  gx[2] = 0;
  gx[3] = 1;
  gx[4] = 0;
  gx[5] = 1;
  for (int i = 6;i < 15;i++)
  {
   gx[i] = 0;
  }
  contenetPane.add(buttonzero);
  buttonzero.addActionListener(this);
  contenetPane.add(buttonrandom);
  buttonrandom.addActionListener(this);
  contenetPane.add(buttoncode);
  buttoncode.addActionListener(this);
  contenetPane.validate();
  setBounds(0,200,1000,200);        //x,y,kuan,gao
  setVisible(true);
  setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
 }
 public void actionPerformed(ActionEvent e)     //事件查看机制
 {
  if (e.getSource() == buttonrandom)         //随机按钮被触发
  {
   for (int i = 0;i < 10;i++)
   {
    buttonarray[i].setText(""+random());
   }
  }
  if (e.getSource() == buttonzero)           //清零按钮被触发
  {
   for (int i = 0;i < 16;i++)
   {
    buttonarray[i].setText("0");
   }
  }
  for (int i = 0;i < 10;i++)                 //查看是哪个按钮被触发
  {
   if (e.getSource() == buttonarray[i])
   {
    if (buttonarray[i].getText() == "0") //反向显示
    {
     buttonarray[i].setText("1");
     break;
    }
    else
    {
     buttonarray[i].setText("0");
     break;
    }
   }
  }
  if (e.getSource() == buttoncode)           //编码按钮被触发
  {
      System.out.println("");
   reset(gx);                             //把选定的多项式比特序列重新设置
   for (int i = 0;i < 10;i++)             //获得按钮此时的0,1序列值
   {
    fx[i] = Integer.parseInt(buttonarray[i].getText());
    save[i] = fx[i];
   }
   for (int i = 10;i < 15;i++)            //后面为5个0
   {
    fx[i] = 0;
    save[i] = fx[i];
   }
   getarithmeticalcompliment(fx,gx);      //得到余数
   for (int i = 0;i < 15;i++)
   {
    save[i] = save[i] + fx[i];         //加上计算完后的余数
    buttonarray[i].setText(""+save[i]);
   }     
  }
 }
 public int random()                                    //产生0-1之间的随机数
 {
  return (int) (Math.random()+0.5);
 }
 //运用递归运算找出结果
 public void getarithmeticalcompliment(int[] up,int[] down)       //得到余数
 {
  while (true)                                   //还没有算完
  {
   step = sign;
            sign = 0;
   for (int i = 0;i < 15;i++)                    //确定GX应该移位几次
   {
    if (up[i] == 1)                          //从左向右搜索找第一个是一的项
    {
     i = 16;
    }
    else if (up[i] == 0)                     //如果为0的话
    {
     sign++;                              //否则记下当前最前面有几个0     
    }    
   }
   if (sign <= 9)                               //得到余数的条件
   {     
   step = sign - step;                          //这才是当前要移动的步数
      move(gx,step);                               //把GX移动相应的步数
   for (int i = 0;i < 15;i++)
   {
    up[i] = up[i]^down[i];                     //执行异或操作    
   }
   }
   else
   {
    break;
   } 
  }
 }
 public void move(int[] temp,int num)                //移动位置操作
 {
  int save[];
  int i,j;                                        //num为移位次数
  save = new int[15];
  for (j = 0;j < num;j++)
  {
   for (i = 0;i < 14;i++)
   {
    save[i+1] = temp[i];
   }
   save[0] = temp[i];                           //把最后一个放入第一个
   for (i = 0;i < 15;i++)                       //字符整体赋值
   {
    temp[i] = save[i];                          
   }  
  } 
 }
 public void reset(int[] down)                        //重新设置GX中的内容
 {
  down[0] = 1;
  down[1] = 1;
  down[2] = 0;
  down[3] = 1;
  down[4] = 0;
  down[5] = 1;
  for (int i = 6;i < 15;i++)
  {
   down[i] = 0;
  }
 }
}
class ParityCheck
{
 public static void main(String args[])
 {
  WindowGrid win = new WindowGrid("CRC校验测试");
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值