aboutsummaryrefslogtreecommitdiffstats
path: root/src/generic/crc16_ccitt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/generic/crc16_ccitt.c')
-rw-r--r--src/generic/crc16_ccitt.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/generic/crc16_ccitt.c b/src/generic/crc16_ccitt.c
new file mode 100644
index 00000000..8347bb83
--- /dev/null
+++ b/src/generic/crc16_ccitt.c
@@ -0,0 +1,22 @@
+// Code for crc16_ccitt
+//
+// Copyright (C) 2016 Kevin O'Connor <kevin@koconnor.net>
+//
+// This file may be distributed under the terms of the GNU GPLv3 license.
+
+#include "misc.h" // crc16_ccitt
+
+// Implement the standard crc "ccitt" algorithm on the given buffer
+uint16_t
+crc16_ccitt(char *buf, uint8_t len)
+{
+ uint16_t crc = 0xffff;
+ while (len--) {
+ uint8_t data = *buf++;
+ data ^= crc & 0xff;
+ data ^= data << 4;
+ crc = ((((uint16_t)data << 8) | (crc >> 8)) ^ (uint8_t)(data >> 4)
+ ^ ((uint16_t)data << 3));
+ }
+ return crc;
+}