diff --git a/src/main/java/com/thealgorithms/others/CRC16.java b/src/main/java/com/thealgorithms/others/CRC16.java new file mode 100644 index 00000000..80dbbcb9 --- /dev/null +++ b/src/main/java/com/thealgorithms/others/CRC16.java @@ -0,0 +1,29 @@ +package com.thealgorithms.others; + +/** + * Generates a crc16 checksum for a given string + */ +public class CRC16 { + + public static void main(String[] args) { + System.out.println(crc16("Hello World!")); + } + + public static String crc16(String message) { + int crc = 0xFFFF; // initial value + int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12) + byte[] bytes = message.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; + return Integer.toHexString(crc).toUpperCase(); + } +} diff --git a/src/test/java/com/thealgorithms/others/CRC16Test.java b/src/test/java/com/thealgorithms/others/CRC16Test.java new file mode 100644 index 00000000..057d5b7d --- /dev/null +++ b/src/test/java/com/thealgorithms/others/CRC16Test.java @@ -0,0 +1,23 @@ +package com.thealgorithms.others; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CRC16Test { + + CRC16 crc = new CRC16(); + + @Test + void testCRC16() { + // given + String textToCRC16 = "hacktoberfest!"; + + // when + String resultCRC16 = crc.crc16(textToCRC16); // Algorithm CRC16-CCITT-FALSE + + // then + assertEquals("10FC", resultCRC16); + } + +}