#include <stdio.h>
#include <stdint.h>
typedef struct {
uint8_t dst;
uint8_t l;
uint8_t crc_m;
uint8_t h;
uint8_t crc_l;
} cct_frame_t;
static cct_frame_t cct_frame;
uint16_t calculate_crc_loop_CCITT_A( int l, uint8_t *p, uint16_t seed )
{
int i, j;
uint16_t crc = seed;
for ( i = 0; i < l; ++i )
{
crc ^= ( p[ i ] << 8 );
for ( j = 0; j < 8; ++j )
{
if ( crc & 0x8000 ){
crc = ( crc << 1 ) ^ 0x1021; // 0001.0000 0010.0001 = x^12 + x^5 + 1 ( + x^16 )
}
else{
crc <<= 1;
}
}
}
return crc;
}
int main(void) {
uint16_t crc = 0;
cct_frame.dst = 0;
cct_frame.l = 0;
cct_frame.h = 4;
crc = calculate_crc_loop_CCITT_A(1, &cct_frame.dst, crc);
crc = calculate_crc_loop_CCITT_A(1, &cct_frame.l, crc);
crc = calculate_crc_loop_CCITT_A(1, &cct_frame.h, crc);
cct_frame.crc_m = 0xFF & (crc >> 8);
cct_frame.crc_l = 0xFF & crc;
printf ("%x %x %x %x %x\n %x", cct_frame.
dst, cct_frame.
l, cct_frame.
crc_m, cct_frame.
h, cct_frame.
crc_l, crc
);
// your code goes here
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KCnR5cGVkZWYgc3RydWN0IHsKCXVpbnQ4X3QgZHN0OwoJdWludDhfdCBsOwoJdWludDhfdCBjcmNfbTsKCXVpbnQ4X3QgaDsKCXVpbnQ4X3QgY3JjX2w7Cn0gY2N0X2ZyYW1lX3Q7CgpzdGF0aWMgY2N0X2ZyYW1lX3QgY2N0X2ZyYW1lOwoKCgp1aW50MTZfdCBjYWxjdWxhdGVfY3JjX2xvb3BfQ0NJVFRfQSggaW50IGwsIHVpbnQ4X3QgKnAsIHVpbnQxNl90IHNlZWQgKQp7CiAgICBpbnQgaSwgajsKICAgIHVpbnQxNl90IGNyYyA9IHNlZWQ7CiAgICBmb3IgKCBpID0gMDsgaSA8IGw7ICsraSApCiAgICB7CiAgICAgICAgY3JjIF49ICggcFsgaSBdIDw8IDggKTsKICAgICAgICBmb3IgKCBqID0gMDsgaiA8IDg7ICsraiApCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGNyYyAmIDB4ODAwMCApewogICAgICAgICAgICAgICAgY3JjID0gKCBjcmMgPDwgMSApIF4gMHgxMDIxOyAvLyAwMDAxLjAwMDAgMDAxMC4wMDAxID0geF4xMiArIHheNSArIDEgKCArIHheMTYgKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBjcmMgPDw9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY3JjOwp9CgppbnQgbWFpbih2b2lkKSB7Cgl1aW50MTZfdCBjcmMgPSAwOwoJCgljY3RfZnJhbWUuZHN0ID0gMDsKCWNjdF9mcmFtZS5sID0gMDsKCWNjdF9mcmFtZS5oID0gNDsKCWNyYyA9IGNhbGN1bGF0ZV9jcmNfbG9vcF9DQ0lUVF9BKDEsICZjY3RfZnJhbWUuZHN0LCBjcmMpOwoJY3JjID0gY2FsY3VsYXRlX2NyY19sb29wX0NDSVRUX0EoMSwgJmNjdF9mcmFtZS5sLCBjcmMpOwoJY3JjID0gY2FsY3VsYXRlX2NyY19sb29wX0NDSVRUX0EoMSwgJmNjdF9mcmFtZS5oLCBjcmMpOwoJY2N0X2ZyYW1lLmNyY19tID0gMHhGRiAmIChjcmMgPj4gOCk7CgljY3RfZnJhbWUuY3JjX2wgPSAweEZGICYgY3JjOwoJCglwcmludGYgKCIleCAleCAleCAleCAleFxuICV4IiwgY2N0X2ZyYW1lLmRzdCwgY2N0X2ZyYW1lLmwsIGNjdF9mcmFtZS5jcmNfbSwgY2N0X2ZyYW1lLmgsIGNjdF9mcmFtZS5jcmNfbCwgY3JjKTsKCQoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0K