2012-12-30 54 views
1

我有一個255字節數據的CRC16校驗和功能。解釋這個CRC16校驗和功能

校驗和計算從第1個字節到最後第3個字節。 您能否告訴我們這些代碼中發生了什麼,特別是「ekmCheckCrc」函數?下面是 是我得到的功能。

public void tryMe(byte[] responseFromDevice) 
{ 
      byte[] c = new byte[2]; 
      c[0] = a[253]; 
      c[1] = a[254]; 

      log("EKM CRC : " + Integer.toHexString(ekmCheckCrc(responseFromDevice)) + 
      " Device CRC : " + Integer.toHexString((int) (c[0])) + Integer.toHexString((int) (c[1]))); 
} 

    public int ekmCheckCrc(byte[] dat) { 
     int crc = 0xffff; 

     for (int i = 1; i < dat.length-3; i++) { 
      crc = (crc >>> 8)^ekmCrcLut[(crc^dat[i]) & 0xff]; 
     } 

     crc = (crc >>> 8) | (crc << 8); 
     crc = crc & 0x7f7f; 

     return crc; 
    } 

    static int[] ekmCrcLut = new int[]{ 
     0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 
         (EKM's LUT sits here, no point including the rest of it) 
     0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040 
    }; 

回答

0

假設a相同responseFromDevice,它的計算某種散列函數用於消息(減去的第一個字節和最後三個字節),然後打印出來,加上一個數字(校驗和)在消息的最後找到。它跳過的字節是設備的校驗和,並且可能是一些幀字節。一個真正的實現可能會將計算出來的哈希與消息中發現的哈希進行比較,以驗證它是否完好無損。

如果你真的想知道哈希函數是如何工作的,你必須閱讀這個主題,但如果你需要一個關於他們做什麼和他們的優點的外圍描述,請閱讀the Wikipedia article

+0

好嗎但到底是什麼此代碼做: 對(INT I = 1;我>> 8)^ ekmCrcLut [(CRC^DAT [I ])&0xff]; } –

+0

@Fazel:它是哈希計算的一部分。我不打算向您解釋基本算法的工作原理 - 閱讀有關Java運算符的教程或其他內容 –