#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[] = { 0x05, 0x07, 0xE6, 0x0E, 0x01, 0x06, 0x41, 0xFC,
0xCA, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x14,
0xF1, 0x0E, 0x08, 0x2F, 0x88, 0xD5, 0x9D, 0x0C,
0x00, 0x00, 0xCB, 0x00, 0x0D, 0x01, 0xAD, 0x4A,
0x05, 0x07, 0xE6, 0x0E, 0x01, 0x06, 0x41, 0xFC,
0xCA, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x14,
0xF1, 0x0E, 0x08, 0x2F, 0x88, 0xD5, 0x9D, 0x0C,
0x00, 0x00, 0xCB, 0x00, 0x0D, 0x01, 0xAD, 0x4A,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xBF };
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+PiAxKSBeIENSQzhfUE9MWTsKCQllbHNlCgkJCWNyYyA9IChjcmMgPj4gMSk7Cgl9CgoJcmV0dXJuIGNyYzsKfQoKaW50IGNyYzE2KHVpbnQ4X3QgKmRhcnJ5LCB1aW50MTZfdCBzeikKewoJdWludDE2X3QgY3JjID0gMDsKCXVpbnQxNl90IGk7CgoJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspCgkJY3JjID0gX2NyYzE2X3VwZGF0ZShjcmMsIGRhcnJ5W2ldKTsKCglyZXR1cm4gY3JjOwp9CgppbnQgY3JjOCh1aW50OF90ICpkYXJyeSwgdWludDE2X3Qgc3opCnsKCXVpbnQ4X3QgY3JjID0gMDsKCXVpbnQxNl90IGk7CgoJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspCgkJY3JjID0gX2NyYzhfdXBkYXRlKGNyYywgZGFycnlbaV0pOwoKCXJldHVybiBjcmM7Cn0KCmludCBtYWluKHZvaWQpCnsKCXVpbnQ4X3QgZGF0YVtdID0geyAgMHgwNSwgMHgwNywgMHhFNiwgMHgwRSwgMHgwMSwgMHgwNiwgMHg0MSwgMHhGQywKCQkJCQkgICAgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHgxNCwKCQkJCQkgICAgMHhGMSwgMHgwRSwgMHgwOCwgMHgyRiwgMHg4OCwgMHhENSwgMHg5RCwgMHgwQywKCQkJCQkgICAgMHgwMCwgMHgwMCwgMHhDQiwgMHgwMCwgMHgwRCwgMHgwMSwgMHhBRCwgMHg0QSwKCQkJCQkgICAgMHgwNSwgMHgwNywgMHhFNiwgMHgwRSwgMHgwMSwgMHgwNiwgMHg0MSwgMHhGQywKCQkJCQkgICAgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHgxNCwKCQkJCQkgICAgMHhGMSwgMHgwRSwgMHgwOCwgMHgyRiwgMHg4OCwgMHhENSwgMHg5RCwgMHgwQywKCQkJCQkgICAgMHgwMCwgMHgwMCwgMHhDQiwgMHgwMCwgMHgwRCwgMHgwMSwgMHhBRCwgMHg0QSwKCQkJCQkgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKCQkJCQkgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKCQkJCQkgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKCQkJCQkgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKCQkJCQkgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKCQkJCQkgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKCQkJCQkgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKCQkJCQkgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHhCRiB9OwoKCXVpbnQxNl90IGNyY18xNiA9IGNyYzE2KGRhdGEsIHNpemVvZihkYXRhKS9zaXplb2YodWludDhfdCkpOwoJdWludDhfdCBjcmNfOCA9IGNyYzgoZGF0YSwgc2l6ZW9mKGRhdGEpL3NpemVvZih1aW50OF90KSk7CgoJcHJpbnRmKCJDUkMgPSAlMDRYIHwgJTAyeFxuIiwgY3JjXzE2LCBjcmNfOCk7CgoJcmV0dXJuIDA7Cn0K