#include <stdio.h>
#include <stdint.h>
#define CRC16_POLY 0xA001
#define CRC8_POLY 0x8C
uint16_t _crc16_update(uint16_t crc, uint8_t a)
{
int i;
crc ^= a;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ CRC16_POLY;
else
crc = (crc >> 1);
}
return crc;
}
uint8_t _crc8_update(uint8_t crc, uint8_t a)
{
int i;
crc ^= a;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ CRC8_POLY;
else
crc = (crc >> 1);
}
return crc;
}
int crc16(uint8_t *darry, uint16_t sz)
{
uint16_t crc = 0;
uint16_t i;
for (i = 0; i < sz; i++)
crc = _crc16_update(crc, darry[i]);
return crc;
}
int crc8(uint8_t *darry, uint16_t sz)
{
uint8_t crc = 0;
uint16_t i;
for (i = 0; i < sz; i++)
crc = _crc8_update(crc, darry[i]);
return crc;
}
int main(void)
{
uint8_t data[] =
{
0xA2, 0x03, 0xFD, 0x02, 0xC5, 0x03, 0x61, 0x03, 0xBC,
0x01, 0xFF, 0x00, 0xC7, 0x01, 0x63, 0x01, 0x19, 0x00,
0x05, 0x00, 0x0A, 0x00, 0x64, 0x00, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x1C, 0xC6
};
uint16_t crc_16 = crc16(data, sizeof(data)/sizeof(uint8_t));
uint8_t crc_8 = crc8(data, sizeof(data)/sizeof(uint8_t));
printf("CRC = %04X | %02x\n", crc_16
, crc_8
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KCiNkZWZpbmUgQ1JDMTZfUE9MWSAgMHhBMDAxCiNkZWZpbmUgQ1JDOF9QT0xZICAweDhDCgp1aW50MTZfdCBfY3JjMTZfdXBkYXRlKHVpbnQxNl90IGNyYywgdWludDhfdCBhKQp7CglpbnQgaTsKCgljcmMgXj0gYTsKCglmb3IgKGkgPSAwOyBpIDwgODsgKytpKQoJewoJCWlmIChjcmMgJiAxKQoJCQljcmMgPSAoY3JjID4+IDEpIF4gQ1JDMTZfUE9MWTsKCQllbHNlCgkJCWNyYyA9IChjcmMgPj4gMSk7Cgl9CgoJcmV0dXJuIGNyYzsKfQoKdWludDhfdCBfY3JjOF91cGRhdGUodWludDhfdCBjcmMsIHVpbnQ4X3QgYSkKewoJaW50IGk7CgoJY3JjIF49IGE7CgoJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKCXsKCQlpZiAoY3JjICYgMSkKCQkJY3JjID0gKGNyYyA+PiAxKSBeIENSQzhfUE9MWTsKCQllbHNlCgkJCWNyYyA9IChjcmMgPj4gMSk7Cgl9CgoJcmV0dXJuIGNyYzsKfQoKaW50IGNyYzE2KHVpbnQ4X3QgKmRhcnJ5LCB1aW50MTZfdCBzeikKewoJdWludDE2X3QgY3JjID0gMDsKCXVpbnQxNl90IGk7CgoJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspCgkJY3JjID0gX2NyYzE2X3VwZGF0ZShjcmMsIGRhcnJ5W2ldKTsKCglyZXR1cm4gY3JjOwp9CgppbnQgY3JjOCh1aW50OF90ICpkYXJyeSwgdWludDE2X3Qgc3opCnsKCXVpbnQ4X3QgY3JjID0gMDsKCXVpbnQxNl90IGk7CgoJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspCgkJY3JjID0gX2NyYzhfdXBkYXRlKGNyYywgZGFycnlbaV0pOwoKCXJldHVybiBjcmM7Cn0KCmludCBtYWluKHZvaWQpCnsKCXVpbnQ4X3QgZGF0YVtdID0KCXsKCQkgMHhBMiwgMHgwMywgMHhGRCwgMHgwMiwgMHhDNSwgMHgwMywgMHg2MSwgMHgwMywgMHhCQywKCQkgMHgwMSwgMHhGRiwgMHgwMCwgMHhDNywgMHgwMSwgMHg2MywgMHgwMSwgMHgxOSwgMHgwMCwKCQkgMHgwNSwgMHgwMCwgMHgwQSwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKCQkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKCQkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKCQkgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQywgMHhDNgoJfTsKCQoJdWludDE2X3QgY3JjXzE2ID0gY3JjMTYoZGF0YSwgc2l6ZW9mKGRhdGEpL3NpemVvZih1aW50OF90KSk7Cgl1aW50OF90IGNyY184ID0gY3JjOChkYXRhLCBzaXplb2YoZGF0YSkvc2l6ZW9mKHVpbnQ4X3QpKTsKCglwcmludGYoIkNSQyA9ICUwNFggfCAlMDJ4XG4iLCBjcmNfMTYsIGNyY184KTsKCglyZXR1cm4gMDsKfQo=