JAVA CRC16 循环冗余校验(CRC)算法

循环冗余校验(CRC)算法

CRC 校验(Cyclic Redundancy Check)是一种数据传输错误检查方法。本标准采用 ANSI CRC16, 简称 CRC16。

CRC16 码由传输设备计算后加入到数据包中。接收设备重新计算接收数据包的 CRC16 码,并与接 收到的 CRC16 码比较,如果两值不同,则有误。

CRC16 校验字节的生成步骤如下:

1) CRC16 校验寄存器赋值为 0xFFFF;

2) 取被校验串的第一个字节赋值给临时寄存器;

3) 临时寄存器与 CRC16 校验寄存器的高位字节进行“异或”运算,赋值给 CRC16 校验寄存器;

4) 取 CRC16 校验寄存器最后一位赋值给检测寄存器;

5) 把 CRC16 校验寄存器右移一位;

6) 若检测寄存器值为 1,CRC16 校验寄存器与多项式 0xA001 进行“异或”运算,赋值给 CRC16 校验寄存器;

7) 重复步骤 4~6,直至移出 8 位;

8) 取被校验串的下一个字节赋值给临时寄存器;

9) 重复步骤 3~8,直至被校验串的所有字节均被校验;

10) 返回 CRC16 校验寄存器的值。

校验码按照先高字节后低字节的顺序存放。

unsigned int CRC16_Checkout ( unsigned char *puchMsg, unsigned int usDataLen )

{

    unsigned int i,j,crc_reg,check; 

    crc_reg = 0xFFFF;

    for(i=0;i<usDataLen;i++)  {

        crc_reg = (crc_reg>>8) ^ puchMsg[i];   

        for(j=0;j<8;j++)  { 

                check = crc_reg & 0x0001; 

                crc_reg >>= 1;

                    if(check==0x0001) {   

                            crc_reg ^= 0xA001; 

                        } 

            }

    }

    return crc_reg;

}

示例: ##0101QN=20160801085857223;ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=5 ;CP=&&RtdInterval=30&&1C80
,其中 1C08 为 CRC16 校验码,是对数据段 QN=20160801085857223; ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=5;CP=&&RtdInterval=30&& 进 行 CRC16 校验所得的校验码

Java处理

    /**

    * @param args

    * @Description: HJ212污染监测 CRC16校验算法

    * @author *****

    * @return

    */

    public static String CRC16(String temp) {

        /*        String temp =

            “ST=32;CN=2011;PW=122333;MN=88888880000005;CP=&&DataTime=20120416225856;060-Rtd=0.06,060-Flag=N;011-Rtd=0.00,011-Flag=N;001-Rtd=7.64,001-Flag=N&&”;

        */ // ##0077QN=20120416225111069;ST=91;CN=9021;PW=122333;MN=88888880000006;Flag=1;CP=&&&&4100

          // ##0101QN=20160801085857223;ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=5 ;CP=&&RtdInterval=30&&1C80

        Integer[] regs = new Integer[temp.length()];

        for (int i = 0; i < temp.length(); i++) {

            regs[i] = (int)temp.charAt(i);

        }

        int por = 0xFFFF;

        for (int j = 0; j < regs.length; j++) {

            por = por >> 8;

            por ^= regs[j];

            for (int i = 0; i < 8; i++) {

                if ((por & 0x01) == 1) {

                    por = por >> 1;

                    por = por ^ 0xa001;

                } else

                    por = por >> 1;

            }

        }

        return Integer.toHexString(por);

    }

© 版权声明

相关文章

暂无评论

none
暂无评论...