JAVA实现CRC16校验

要求:

CRC循环冗余错误校验计算方法

CRC-16C(循环冗余错误校验)生成CRC-16校验字节的步聚如下:

(1)装入一个16位寄存器,所有数位均为1

(2)16位寄存器的高位字节与开始8位字节进行“异或”运算。运算结果放入这个16位寄存器。

(3)把这个16位寄存器向右移1位。

(4a)若向右(标记位)移出的数位是1,则生成多项式1010000000000001和这个寄存器进行“异或”运算。

(4b)若向右移出的数位是0,则返回(3)

(5)重处处(3)(4),直至移出8位。

(6)另外8位与该16位寄存器进行“异或”运算。

(7)重处处(3)-(6),直至该报文所有字节均与16位寄存器进行“异或”运算,并移位8次。

(8)这个16位寄存器的内容即2字节CRC错误校验。

public class CRC {
    
private byte[] CRC=new byte[2];
    
    
byte data;
    
byte[] reg=new byte[2];
    
byte[] ploy=new byte[2];
    
byte Op;
    
    
public CRC(byte[] source){
        
//初始化多项式
        int temp=0xA001;
        ploy
=InttoByteArray(temp,2);
        
//初始化寄存器
        temp=0xFFFF;
        reg
=InttoByteArray(temp,2);
        
        
for(int i=0;i<source.length;i++){
            
//获取数据
            data=source[i];
            
//与寄存器中数据进行异或操作
            reg[1]=(byte) (reg[1]^data);
            
//移动数据
            for(int j=0;j<8;j++){
                
//获取数据的最后一位,即被移动出的数据判断是否与多项式异或
                Op=reg[0];
                
//右移一位
                reg=InttoByteArray(ByteArraytoInt(reg)>>1,2);
                
//如果移出数据为1
                if((Op&0x01)==1){
                    
//与多项式进行异或操作
                    reg[0]=(byte) (reg[0]^ploy[0]);
                    reg[
1]=(byte) (reg[1]^ploy[1]);
                }                
            }
        }
        CRC
=reg;        
    }

    
public byte[] getCRC() {
        
return CRC;
    }
//格式化辅助函数
    private static byte[] InttoByteArray(int iSource, int iArrayLen) {
        
byte[] bLocalArr = new byte[iArrayLen];
        
for ( int i = 0; (i < 4&& (i < iArrayLen); i++) {
            bLocalArr[i] 
= (byte)( iSource>>8*& 0xFF );          
        }
        
return bLocalArr;
    }
    
    
private static int ByteArraytoInt(byte[] bRefArr) {
        
int iOutcome = 0;
        
byte bLoop;
        
        
for ( int i =0; i<bRefArr.length ; i++) {
            bLoop 
= bRefArr[i];
            iOutcome
+= (bLoop & 0xFF<< (8 * i);
          
        }         
        
return iOutcome;
    }    
}

开始把高低位搞混了,以为reg[0]是高位,调整了半天。郁闷!
另外,好像CRC算法也有好多种,我就没在网上找到用户要求的这种算法。貌似这个算法是Modbus协议中的CRC校验方式。有待确认。

posted on 2008-07-24 12:11 SeesSea 阅读(8701) 评论(2)  编辑  收藏 所属分类: JAVA

评论

# re: JAVA实现CRC16校验 2011-09-23 17:09 大四喜

我按照这个写出来,还是验证不正确,估计还是有错误的。  回复  更多评论   

# re: JAVA实现CRC16校验 2011-12-16 09:30 hujiaqimama

我套用这个,还是验证不正确,  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜