要求:
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*i & 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校验方式。有待确认。