2012-11-03 78 views
7

我目前正在開發一個項目,使嵌入式系統通過無線電向PC發送數據。數據包最後得到一個crc16校驗和,並根據該算法進行計算:將C CRC16轉換爲Java CRC16

uint16_t crc16 (const uint8_t * buffer, uint32_t size) { 
    uint16_t crc = 0xFFFF; 

    if (buffer && size) 
     while (size--) 
     { 
      crc = (crc >> 8) | (crc << 8); 
      crc ^= *buffer++; 
      crc ^= ((unsigned char) crc) >> 4; 
      crc ^= crc << 12; 
      crc ^= (crc & 0xFF) << 5; 
     } 

    return crc; 
} 

現在我正在尋找Java中的等效項。我已經在這裏找到一個很好的一個: http://introcs.cs.princeton.edu/java/51data/CRC16CCITT.java.html

public class CRC16CCITT { 

    public static void main(String[] args) { 
     int crc = 0xFFFF;   // initial value 
     int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12) 

     // byte[] testBytes = "123456789".getBytes("ASCII"); 

     byte[] bytes = args[0].getBytes(); 

     for (byte b : bytes) { 
      for (int i = 0; i < 8; i++) { 
       boolean bit = ((b >> (7-i) & 1) == 1); 
       boolean c15 = ((crc >> 15 & 1) == 1); 
       crc <<= 1; 
       if (c15^bit) crc ^= polynomial; 
      } 
     } 

     crc &= 0xffff; 
     System.out.println("CRC16-CCITT = " + Integer.toHexString(crc)); 
    } 

} 

但隨着我的C代碼,這並不工作。

是否有人能夠爲C和Java等效算法提供自適應或解決方案? 謝謝!

+0

你爲什麼要設置'CRC ='在每個迭代上,因爲這是一樣的忽視每一個值,但最後。 –

+0

那我該怎麼寫呢? crc^=?我剛剛從一個與之合作的開源項目中複製了代碼。 – tellob

+0

計算CRcs的速度比這更快。不停尋找。有一個表驅動的方法。 – EJP

回答

21

在這種情況下,java和c之間的主要區別在於你使用無符號數字,而java只有有符號數。雖然可以使用帶符號的數字實現相同的算法,但您必須注意到符號位在移位操作中被遺留的事實,需要額外的「和」。

這是我實現:

static int crc16(final byte[] buffer) { 
    int crc = 0xFFFF; 

    for (int j = 0; j < buffer.length ; j++) { 
     crc = ((crc >>> 8) | (crc << 8))& 0xffff; 
     crc ^= (buffer[j] & 0xff);//byte to int, trunc sign 
     crc ^= ((crc & 0xff) >> 4); 
     crc ^= (crc << 12) & 0xffff; 
     crc ^= ((crc & 0xFF) << 5) & 0xffff; 
    } 
    crc &= 0xffff; 
    return crc; 

} 
+0

這是我發佈的c代碼的實現嗎? – tellob

+0

這是我在我的代碼中使用的CRC函數 - 只要初始值相同(0xFFFF)且多項式相同(0x1021),它們應該給出完全相同的結果。 – thedayofcondor

+0

我得到的軟件包是: 1 20 0 -30 -1 72 -31 -110 64 1 0 2 0 3 0 4 0 5 0 125 -7。 21字節。軟件包crc然後是-1667。我不得不改變最後一個字節的順序。當我使用你的算法crc爲我提供3377. – tellob