RS41ng/src/codecs/cats/crc.c

33 wiersze
860 B
C

#include "crc.h"
uint16_t calc_crc(uint8_t *data, size_t length);
size_t cats_append_crc(uint8_t *data, size_t len)
{
uint16_t crc = calc_crc(data, len);
data[len++] = crc;
data[len++] = crc >> 8;
return len;
}
// https://stackoverflow.com/questions/69850602/converting-c-to-java-for-crc16-ibm-sdlc
uint16_t calc_crc(uint8_t *data, size_t length)
{
uint8_t *ptr = data;
uint8_t crcbyte1 = 0xFF;
uint8_t crcbyte2 = 0xFF;
for (int i = 0; i < length; i++) {
uint8_t r1 = *ptr++ ^ crcbyte2;
r1 = (r1 << 4) ^ r1;
crcbyte2 = (r1 << 4) | (r1 >> 4);
crcbyte2 = (crcbyte2 & 0x0F ) ^ crcbyte1;
crcbyte1 = r1;
r1 = (r1 << 3) | (r1 >> 5);
crcbyte2 = crcbyte2 ^ (r1 & 0xF8);
crcbyte1 = crcbyte1 ^ (r1 & 0x07);
}
return ~((crcbyte1 << 8) | crcbyte2);
}