Immer die CRC-Prüfsumme von byte-array und hinzufügen, um das byte-array
Habe ich dieses byte array:
static byte[] buf = new byte[] { (byte) 0x01, (byte) 0x04, (byte)0x00, (byte)0x01,(byte)0x00, (byte) 0x01};
Nun, die CRC-Checksumme dieses byte-array sein soll, 0x60 0x0A. Ich möchte den Java-code neu dieses Prüfsumme, aber ich kann nicht scheinen, um es neu erstellen. Ich habe versucht crc16:
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 konvertieren Sie Sie mithilfe von Integer.toHexString(), aber keines der Ergebnisse mit den richtigen CRC. Könnte jemand bitte zeigen Sie mich in die richtige Richtung in Bezug auf die CRC-Formel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stattdessen den folgenden code verwenden:
Müssen Sie eventuell rückgängig return CRC, um die richtige endianness, obwohl. Ich selbst getestet es hier:
http://ideone.com/PrBXVh
Mithilfe der windows-Taschenrechner oder etwas, das Sie sehen, dass die erste Folge (aus der obigen Funktionsaufruf) gibt den erwarteten Wert (wenn auch Umgekehrt).
Würde CRC32 tun, oder muss es CRC16? Wenn 32 ist okay, haben Sie versucht, mit dem
CRC32
imjava.util.zip
?Ausgabe:
Dann Sie können tun, was immer zusätzliche Berechnung, die Sie wollen, oben auf, dass.
Dem ich arbeitete, modbus, die mit Java 1.6, habe versucht den obigen code, und es nur teilweise funktioniert? Einigten sich auf einige CRCs, falsch auf andere. Ich recherchierte es ein bisschen mehr, und sah, hatte ich ein problem mit sign-extension. Ich maskiert aus der high-bits (siehe UPDATE unten) und jetzt funktioniert es Super.
HINWEIS: Alle CRC-calcs sind nicht die gleichen, MODBUS ist ein bisschen anders: