+ return ((crc >> 8) ^ tcrc) & 0xffff;
+}
+
+uint16_t crc16(uint8_t const *message, int length, uint16_t remainder, uint16_t polynomial) {
+
+ if (length == 0)
+ return (~remainder);
+
+ for (uint32_t i = 0; i < length; ++i) {
+ remainder ^= (message[i] << 8);
+ for (uint8_t bit = 8; bit > 0; --bit) {
+ if (remainder & 0x8000) {
+ remainder = (remainder << 1) ^ polynomial;
+ } else {
+ remainder = (remainder << 1);
+ }
+ }
+ }
+ return remainder;
+}
+
+uint16_t crc16_ccitt(uint8_t const *message, int length) {
+ return crc16(message, length, 0xffff, CRC16_POLY_CCITT);
+}
+
+uint16_t crc16_ccitt_kermit(uint8_t const *message, int length) {
+ uint16_t val = crc16(message, length, 0x0000, CRC16_POLY_CCITT);
+ return SwapBits(val, 16);