Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java Security  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 Java写的CRC算法,请各位指正!
breezy





发贴: 3
积分: 0
于 2005-11-21 17:02 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
本算法采用CRC-16码。 其计算过程为:

1. 设置CRC-16寄存器(16-bit),使寄存器中的每一位都置为0。

2. 按顺序逐个传送数据Data(8-bit)。

3. 将Data的最后一位与CRC-16寄存器的最后一位进行异或。

4. 对异或结果进行分析。

若异或结果为1,则CRC-16寄存器先右移一位,并把右移一位的值存入CRC-16寄存器;然后再与多项式码(预先设置好的,16-bit:$A001)逐位异或,最后把异或结果存入CRC-16寄存器。

若异或结果为0,则CRC-16寄存器右移一位,并把右移一位的值存入CRC-16寄存器。

5. 将Data右移一位,并把右移一位的值赋给Data。

6. 重复第3至5步,直到8次移位全部完成。此时Data处理完毕。

7. 重复第2至6步,直到所有数据处理完毕。此时CRC-16寄存器的即为最终CRC-16寄存器的值即为最终CRC-16的值。

8.将最终CRC-16的值转换成4位16进制数 循环冗余校验码
以下是实现代码,各位老兄看看,是不是这样写的?请帮忙指正!

String test1 = "200505279819580113022b7000101014120.00G500223100083129026426489";
short register = (short)0x0000;
short ploy = (short)0xA001;
byte[] code1 = test1.getBytes();

for(int i=0; i<code1.length;i++){
byte data = code1[i];
for(int j=0;j<8;j++){
if(((data & 0x01) ^ (register & 0x0001)) == 0x1){
register = (short)(register >> 1);
register = (short)(register ^ ploy);
}else {
register = (short)(register >> 1);
}
data = (byte)(data >> 1);
}
}
register 的值就是最终的CRC校验码。




flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923