#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
uint16_t MyCrc16(const unsigned char *data, int length, uint16_t poly, uint16_t crc)
{
for(int byte=0; byte<length; ++byte)
{
for(int bit=7; bit>=0; --bit)
{
bool doXor = false;
if(crc & 0x8000)
{
doXor = true;
}
crc <<= 1;
if(data[byte] & (1 << bit))
{
crc += 1;
}
if(doXor)
{
crc ^= poly;
}
}
}
//augument the crc with 0s
for(int i=0; i<16; i++)
{
bool doXor = false;
if(crc & 0x8000)
{
doXor = true;
}
crc = crc << 1;
if(doXor)
{
crc ^= poly;
}
}
return crc;
}
uint16_t OtherCrc16(const unsigned char *data, int length, uint16_t poly, uint16_t crc)
{
for(int i=0; i<length; i++)
{
crc = crc ^ (data[i] << 8);
for (int bit = 0; bit< 8; bit++)
{
bool doXor = false;
if(crc & 0x8000)
{
doXor = true;
}
crc <<=1;
if(doXor)
{
crc ^= poly;
}
}
}
return crc;
}
int main(void) {
// your code goes here
uint16_t poly = 0x1021;
unsigned char c[] = "123456789";
printf("My CRC = %04x\n", MyCrc16
(c
, 9, poly
, 0xffff)); printf("Other CRC = %04x\n", OtherCrc16
(c
, 9, poly
, 0xffff)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KCnVpbnQxNl90IE15Q3JjMTYoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbmd0aCwgdWludDE2X3QgcG9seSwgdWludDE2X3QgY3JjKQp7CiAgICAgICAgZm9yKGludCBieXRlPTA7IGJ5dGU8bGVuZ3RoOyArK2J5dGUpCiAgICAgICAgewogICAgICAgICAgICAgICAgZm9yKGludCBiaXQ9NzsgYml0Pj0wOyAtLWJpdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb1hvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBpZihjcmMgJiAweDgwMDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1hvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY3JjIDw8PSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhW2J5dGVdICYgKDEgPDwgYml0KSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvWG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjIF49IHBvbHk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy9hdWd1bWVudCB0aGUgY3JjIHdpdGggMHMKICAgICAgICBmb3IoaW50IGk9MDsgaTwxNjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGJvb2wgZG9Yb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmKGNyYyAmIDB4ODAwMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9Yb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBjcmMgPSBjcmMgPDwgMTsKICAgICAgICAgICAgICAgIGlmKGRvWG9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjcmMgXj0gcG9seTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBjcmM7Cn0KCnVpbnQxNl90IE90aGVyQ3JjMTYoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbmd0aCwgdWludDE2X3QgcG9seSwgdWludDE2X3QgY3JjKQp7CiAgICAgICAgZm9yKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspCiAgICAgICAgewogICAgICAgICAgICAgICAgY3JjID0gY3JjIF4gKGRhdGFbaV0gPDwgOCk7CiAgICAgICAgICAgICAgICBmb3IgKGludCBiaXQgPSAwOyBiaXQ8IDg7IGJpdCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvWG9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNyYyAmIDB4ODAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvWG9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjcmMgPDw9MTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvWG9yKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjIF49IHBvbHk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNyYzsKfQoKCmludCBtYWluKHZvaWQpIHsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXVpbnQxNl90IHBvbHkgPSAweDEwMjE7CgkKCXVuc2lnbmVkIGNoYXIgY1tdID0gIjEyMzQ1Njc4OSI7CglwcmludGYoIk15IENSQyA9ICUwNHhcbiIsIE15Q3JjMTYoYywgOSwgcG9seSwgMHhmZmZmKSk7CglwcmludGYoIk90aGVyIENSQyA9ICUwNHhcbiIsIE90aGVyQ3JjMTYoYywgOSwgcG9seSwgMHhmZmZmKSk7CglyZXR1cm4gMDsKfQo=