JAVA实现CRC16校验

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校验方式。有待确认。

你可能感兴趣的:(JAVA实现CRC16校验)