aboutsummaryrefslogtreecommitdiffstats
path: root/src/generic/crc16_ccitt.c
blob: 8347bb83114df3f30670b9ad9b151132889af47e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}