#include <stdio.h>
#include <stdint.h>
uint8_t crc2(uint8_t data) {
uint8_t poly = 0x07; // CRC-2 polynomial (111)
uint8_t crc = 0x00;
for (int i = 0; i < 8; i++) {
uint8_t bit = ((data >> (7 - i)) & 1) ^ ((crc >> 1) & 1);
crc = (crc << 1) & 0x03; // keep only 2 bits
if (bit)
crc ^= poly & 0x03; // apply CRC-2 polynomial
}
return crc & 0x03;
}
int main() {
uint8_t data = 0xAB;
uint8_t result = crc2(data);
printf("CRC-2 of 0x%X = %u\n", data, result);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KCnVpbnQ4X3QgY3JjMih1aW50OF90IGRhdGEpIHsKICAgIHVpbnQ4X3QgcG9seSA9IDB4MDc7ICAgLy8gQ1JDLTIgcG9seW5vbWlhbCAoMTExKQogICAgdWludDhfdCBjcmMgPSAweDAwOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgICAgdWludDhfdCBiaXQgPSAoKGRhdGEgPj4gKDcgLSBpKSkgJiAxKSBeICgoY3JjID4+IDEpICYgMSk7CiAgICAgICAgY3JjID0gKGNyYyA8PCAxKSAmIDB4MDM7IC8vIGtlZXAgb25seSAyIGJpdHMKCiAgICAgICAgaWYgKGJpdCkKICAgICAgICAgICAgY3JjIF49IHBvbHkgJiAweDAzOyAgLy8gYXBwbHkgQ1JDLTIgcG9seW5vbWlhbAogICAgfQogICAgcmV0dXJuIGNyYyAmIDB4MDM7Cn0KCmludCBtYWluKCkgewogICAgdWludDhfdCBkYXRhID0gMHhBQjsKICAgIHVpbnQ4X3QgcmVzdWx0ID0gY3JjMihkYXRhKTsKCiAgICBwcmludGYoIkNSQy0yIG9mIDB4JVggPSAldVxuIiwgZGF0YSwgcmVzdWx0KTsKICAgIHJldHVybiAwOwp9Cg==