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\r\n,其中 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);
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章