2016-06-05 21:52:17 +03:00
|
|
|
// 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
|
2018-05-24 19:49:23 +03:00
|
|
|
crc16_ccitt(uint8_t *buf, uint_fast8_t len)
|
2016-06-05 21:52:17 +03:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|