#include <stdio.h>
#include <string.h>

unsigned short crc_16(unsigned char *data, unsigned int len);
unsigned short update_crc16(unsigned short crc, unsigned char c);

unsigned short crc_16(unsigned char *data, unsigned int len)
{
        unsigned int i;
        unsigned short crc= 0x6363;

        for(i= 0; i < len ; ++i)
                crc=  update_crc16(crc, data[i]);
        return crc;
}

unsigned short update_crc16(unsigned short crc, unsigned char c)   
{
        unsigned short i, v, tcrc = 0;

        v = (crc ^ c) & 0xff;
        for (i = 0; i < 8; i++) 
                {
                tcrc = ( (tcrc ^ v) & 1 ) ? ( tcrc >> 1 ) ^ 0x8408 : tcrc >> 1;
                v >>= 1;
                }
        return ((crc >> 8) ^ tcrc) & 0xffff;
}

int main(void)
{
	unsigned char x[]= {0xAA,0xBB,0xCC,0xDD,0xEE,0x00,0x11,0x22};

	printf("%04X\n",crc_16(x,8));
}
