关于crc8校验算法的问题

yougucao379548695 2009-11-16 11:18:05

package com.hwsy.util;


import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;

public class crc8Appl extends Applet
implements ActionListener
{

private Button btnOk;
private Button btnClear;
private TextField txtMessage;
private TextArea display;
private Label lblFcs;
protected int Fcs;
private Canvas c;

public void init()
{
Panel panel = new Panel();
panel.setLayout(new GridLayout(5, 2, 0, 2));
panel.add(new Label("CRC - 8的多项式, C(x) = "));
panel.add(new Label("x^8 + x^2 + x + 1"));
panel.add(new Label("输入十六进制编码的信息.."));
panel.add(txtMessage);
panel.add(new Label("帧校验序列.."));
panel.add(lblFcs = new Label("0x00"));
panel.add(new Label("点击OK按行计算.."));
panel.add(new Label("按Clear重置为0x00功能界别"));
setLayout(null);
c = new Canvas();
add(panel);
add(btnOk);
add(btnClear);
display.setEditable(true);
add(display);
panel.setBounds(6, 6, 400, 110);
btnOk.setBounds(50, 112, 50, 24);
btnClear.setBounds(120, 112, 50, 24);
display.setBounds(200, 112, 210, 100);
txtMessage.addActionListener(this);
btnOk.addActionListener(this);
btnClear.addActionListener(this);
}

public void actionPerformed(ActionEvent actionevent)
{
boolean flag = false;
String s = "00";
String r = "";
if (actionevent.getSource() == btnClear)
{
txtMessage.setText("");
display.setText("");
lblFcs.setText("输入十六进制编码的信息..");
Fcs = 0;
return;
}
String s1 = txtMessage.getText().trim();
if (s1 != null)
{
for (int j = 0; j < s1.length() / 2; j++)
{
String s2 = s1.substring(2 * j, 2 * j + 2);
System.out.println("s2="+s2);
int i = iByte(s2);
if (i >= 0)
{
calculateCRC(i);
s = makeEven(Integer.toString(Fcs, 16));//将整数Fcs以基数16的形式转换成字符串
displayMessage(s2, s);
//r+="0x"+s;
r+=iByte(s);
} else
{
lblFcs.setText("输入字节错误..");
return;
}
}
System.out.println(r);

}
lblFcs.setText("帧校验 = 0x" + s);
}

void displayMessage(String s, String s1)
{
display.append("字节 = 0x" + s + " 检查 = 0x" + s1 + ".\n");
}

public String makeEven(String s)
{
if (s.length() % 2 == 0)
return s;
else
return "0" + s;
}
/**
* 16进制转为10进制
* @param s
* @return
*/
public int iByte(String s)
{
try
{
//以16为基数16返回s的十进制数(所谓的基数就是“几进制”)
return Integer.parseInt(s, 16);
}
catch (NumberFormatException ex)
{
Fcs = 0;
}
return -1;
}

public void calculateCRC(int i)
{
for (int k = 7; k >= 0; k--)
{
int j = Fcs >> 7 ^ i >> k & 1;
Fcs = Fcs << 1 & 0xff;
for (int l = 1; l <= 3; l++)//3
{
Fcs ^= j;
j <<= 1;
}

}

}

public static void main(String args[])
{
Frame frame = new Frame();
crc8Appl crc8appl = new crc8Appl();
crc8appl.init();
frame.setSize(450, 240);
frame.setTitle("CRC-8 Calculator");
frame.add("Center", crc8appl);
frame.setVisible(true);
}

public crc8Appl()
{
btnOk = new Button(" OK ");
btnClear = new Button("Clear");
txtMessage = new TextField("", 30);
display = new TextArea("结果窗口\n", 5, 30);
}
}



这个看不太懂方程式好像是x^8 + x^2 + x + 1的,谁能给我解说下加上注释最好了

或者改成多项式是这个的crc8校验吧
x^8 + x^4 + x^3+ x^2 + x + 1
...全文
816 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
铃铛2014 2010-01-09
  • 打赏
  • 举报
回复
package com.hwsy.util;


import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;

public class crc8Appl extends Applet
implements ActionListener
{

private Button btnOk;
private Button btnClear;
private TextField txtMessage;
private TextArea display;
private Label lblFcs;
protected int Fcs;
private Canvas c;

public void init()
{
Panel panel = new Panel();
panel.setLayout(new GridLayout(5, 2, 0, 2));
panel.add(new Label("CRC - 8的多项式, C(x) = "));
panel.add(new Label("x^8 + x^2 + x + 1"));
panel.add(new Label("输入十六进制编码的信息.."));
panel.add(txtMessage);
panel.add(new Label("帧校验序列.."));
panel.add(lblFcs = new Label("0x00"));
panel.add(new Label("点击OK按行计算.."));
panel.add(new Label("按Clear重置为0x00功能界别"));
setLayout(null);
c = new Canvas();
add(panel);
add(btnOk);
add(btnClear);
display.setEditable(true);
add(display);
panel.setBounds(6, 6, 400, 110);
btnOk.setBounds(50, 112, 50, 24);
btnClear.setBounds(120, 112, 50, 24);
display.setBounds(200, 112, 210, 100);
txtMessage.addActionListener(this);
btnOk.addActionListener(this);
btnClear.addActionListener(this);
}

public void actionPerformed(ActionEvent actionevent)
{
boolean flag = false;
String s = "00";
String r = "";
if (actionevent.getSource() == btnClear)
{
txtMessage.setText("");
display.setText("");
lblFcs.setText("输入十六进制编码的信息..");
Fcs = 0;
return;
}
String s1 = txtMessage.getText().trim();
if (s1 != null)
{
for (int j = 0; j < s1.length() / 2; j++)
{
String s2 = s1.substring(2 * j, 2 * j + 2);
System.out.println("s2="+s2);
int i = iByte(s2);
if (i >= 0)
{
calculateCRC(i);
s = makeEven(Integer.toString(Fcs, 16));//将整数Fcs以基数16的形式转换成字符串
displayMessage(s2, s);
//r+="0x"+s;
r+=iByte(s);
} else
{
lblFcs.setText("输入字节错误..");
return;
}
}
System.out.println(r);

}
lblFcs.setText("帧校验 = 0x" + s);
}

void displayMessage(String s, String s1)
{
display.append("字节 = 0x" + s + " 检查 = 0x" + s1 + ".\n");
}

public String makeEven(String s)
{
if (s.length() % 2 == 0)
return s;
else
return "0" + s;
}
/**
* 16进制转为10进制
* @param s
* @return
*/
public int iByte(String s)
{
try
{
//以16为基数16返回s的十进制数(所谓的基数就是“几进制”)
return Integer.parseInt(s, 16);
}
catch (NumberFormatException ex)
{
Fcs = 0;
}
return -1;
}

public void calculateCRC(int i)
{
for (int k = 7; k >= 0; k--)
{
int j = Fcs >> 7 ^ i >> k & 1;
Fcs = Fcs << 1 & 0xff;
for (int l = 1; l <= 3; l++)//3
{
Fcs ^= j;
j <<= 1;
}

}

}

public static void main(String args[])
{
Frame frame = new Frame();
crc8Appl crc8appl = new crc8Appl();
crc8appl.init();
frame.setSize(450, 240);
frame.setTitle("CRC-8 Calculator");
frame.add("Center", crc8appl);
frame.setVisible(true);
}

public crc8Appl()
{
btnOk = new Button(" OK ");
btnClear = new Button("Clear");
txtMessage = new TextField("", 30);
display = new TextArea("结果窗口\n", 5, 30);
}
}
yougucao379548695 2009-11-18
  • 打赏
  • 举报
回复
哎现在很少有人懂这个了啊!
realreachard 2009-11-17
  • 打赏
  • 举报
回复
都忘了什么课学的这个了,更别说记得原理了....
yougucao379548695 2009-11-17
  • 打赏
  • 举报
回复
没人研究这个吗?
wgj830823 2009-11-17
  • 打赏
  • 举报
回复
惭愧
我的汗啊。。。。。。。。。
zl3450341 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sangshusen_1988 的回复:]
分很多,可惜不懂,路过
[/Quote]

lzh_me 2009-11-17
  • 打赏
  • 举报
回复
实在不懂。

帮顶....
sangshusen_1988 2009-11-16
  • 打赏
  • 举报
回复
分很多,可惜不懂,路过
andesen 2009-11-16
  • 打赏
  • 举报
回复
汗,狂汗不止

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧