Решил закрепить навык синтеза алгоритмов CRC с числом бит не кратным 8.
Вот что получилось для CRC-15/CAN.
CRC-15/CAN
width=15 poly=0x4599 init=0x0000 refin=false refout=false xorout=0x0000 check=0x059e name="CRC-15"
Таблицы и коды при вычислении выравниваются по старшему биту.
CRC16 CRC15_update(CRC16 crc, uint8_t val){
crc<<=1;
crc^= (val<<8);
crc = (crc << 4) ^ CRC15_Lookup[(crc>>12) & 0xF];
crc = (crc << 4) ^ CRC15_Lookup[(crc>>12) & 0xF];
return (crc>>1);
}
CRC16 CRC15_update(CRC16 crc, uint8_t val){
crc<<=1;
crc^= (val<<8);
crc = (crc << 8) ^ CRC15_Lookup[crc>>8];
return (crc>>1);
}
static const uint16_t CRC15_Lookup[] = {
0x0000, 0x8B32, 0x9D56, 0x1664,
0xB19E, 0x3AAC, 0x2CC8, 0xA7FA,
0xE80E, 0x633C, 0x7558, 0xFE6A,
0x5990, 0xD2A2, 0xC4C6, 0x4FF4,
. . .
};