diff --git a/src/main/java/com/rusefi/can/analysis/J1850_SAE_crc8_Calculator.java b/src/main/java/com/rusefi/can/analysis/J1850_SAE_crc8_Calculator.java new file mode 100644 index 0000000..e67f110 --- /dev/null +++ b/src/main/java/com/rusefi/can/analysis/J1850_SAE_crc8_Calculator.java @@ -0,0 +1,21 @@ +package com.rusefi.can.analysis; + +public class J1850_SAE_crc8_Calculator { + byte crc8(byte[] data, int length) { + byte crc = 0; + + if (data == null) + return 0; + crc ^= 0xff; + int ptr = 0; + + while (length-- > 0) { + crc ^= data[ptr++]; + for (int k = 0; k < 8; k++) + crc = (byte) (((crc & 0x80) != 0) ? (crc << 1) ^ 0x1d : crc << 1); + } + crc &= 0xff; + crc ^= 0xff; + return crc; + } +} diff --git a/src/test/java/com/rusefi/can/analysis/Crc8Test.java b/src/test/java/com/rusefi/can/analysis/Crc8Test.java new file mode 100644 index 0000000..5cbbd55 --- /dev/null +++ b/src/test/java/com/rusefi/can/analysis/Crc8Test.java @@ -0,0 +1,14 @@ +package com.rusefi.can.analysis; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class Crc8Test { + @Test + public void test() { + J1850_SAE_crc8_Calculator c = new J1850_SAE_crc8_Calculator(); + + assertEquals((byte) 0xfc, c.crc8(new byte[]{0x00, 0x00, 0x00, 0x00, (byte) 0xa0, 0x00, 0x2d}, 7)); + } +}