Files
UtilitechAS.amsreader-firmware/lib/AmsDecoder/src/crc.cpp
Gunnar Skjold 14eb27e0d9 crc
2024-03-19 21:50:09 +01:00

55 lines
916 B
C++

/**
* @copyright Utilitech AS 2023
* License: Fair Source
*
*/
#include "crc.h"
uint16_t crc16_x25(const uint8_t* p, int len)
{
uint16_t crc = UINT16_MAX;
while(len--)
for (uint16_t i = 0, d = 0xff & *p++; i < 8; i++, d >>= 1)
crc = ((crc & 1) ^ (d & 1)) ? (crc >> 1) ^ 0x8408 : (crc >> 1);
return (~crc << 8) | (~crc >> 8 & 0xff);
}
uint16_t crc16 (const uint8_t *p, int len) {
uint16_t crc = 0;
while (len--) {
uint8_t i;
crc ^= *p++;
for (i = 0 ; i < 8 ; ++i) {
if (crc & 1)
crc = (crc >> 1) ^ 0xa001;
else
crc = (crc >> 1);
}
}
return crc;
}
uint16_t crc16_1021(const uint8_t *p, int len) {
uint32_t crc = 0x0000;
for(int i = 0; i < len; i++) {
int mask = 0x80;
while(mask > 0) {
crc <<= 1;
if (p[i] & mask){
crc |= 1;
}
mask>>=1;
if (crc & 0x10000) {
crc &= 0xffff;
crc ^= 0x1021;
}
}
}
return crc;
}