2016-04-02 18 views
1

Ich versuche CRC16 aus Zeichenfolge in Android-Anwendung mit folgendem CodeWie bekomme ich gute CRC16 von String in 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; 

} 

und ich habe einige Daten zu erhalten, das Ergebnis als Tabelle unten

expected result

wenn ich A zu vorbei bin, um zu überprüfen diese Funktion bekomme ich B915 was ist schlecht CRC und das gleiche für alle. Warum kann ich kein gutes CRC wie in der Tabelle erwähnt bekommen. Bitte korrigieren Sie mich wo ich falsch mache? Vielen Dank!

Antwort

0

Sie erhalten eine Bad_CRC, weil Sie Bad_CRC berechnen, indem Sie 0xFFFF verwenden. Wenn Sie Good_CRC berechnen möchten, ersetzen Sie es durch 0x1D0F. Hier

enter image description here

ist der Code-Schnipsel:

public static void main(String[] args) { 
    String input = "A"; 
    Integer crcRes = crc16(input.getBytes()); 
    System.out.println("Calculated CRC-CCITT: 0x" + Integer.toHexString(crcRes)); 
} 

private static int crc16(final byte[] buffer) { 
    /* Note the change here */ 
    int crc = 0x1D0F; 
    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; 
} 

Ausgang:

Calculated CRC-CCITT: 0x9479 
+2

Vielen Dank! Es ist gelöst. –

+0

Ihr Willkommen! :) – user2004685

+0

Nein. Dies ist nur ein Bandaid. Der CCIT CRC-16 hat einen Anfangswert von 0xffff. Der einzige andere gemeinsame Anfangswert ist Null. Suchen Sie den Fehler in Ihrem Code und beheben Sie ihn. Es gibt viele Arbeitsbeispiele, einschließlich eines tabellengesteuerten Algorithmus, der achtmal so schnell ist, – EJP