Straightforward 16 bit CRC

/*****************************************
crc.c - straightforward 16 bit CRC
by Alberto Ricci Bitti
released to public domain

compatibility notes:
works on little-endian machines only, assumes 32 bit long integers, 16 bit integers and 8 byte characters
*****************************************/

/*crc-16 standard root*/
#define POLYNOMIAL 0x8005

/*place your own here*/
#define INITIAL_VALUE 0x0000

union {
unsigned long Whole;
struct
{
unsigned char Data;
unsigned int Remainder;
unsigned char Head;
} Part;
} CRC_buffer;

/*internal use only - puts a byte*/
static void PutCRC(unsigned char b)
{
unsigned char i;
CRC_buffer.Part.Data = b;
for (i=0; i<8; i++)
{
CRC_buffer.Whole = CRC_buffer.Whole << 1;
if (CRC_buffer.Part.Head & 0x01)
CRC_buffer.Part.Remainder ^= POLYNOMIAL;
};
}


/*call this routine with your own data buffer*/
/* yes! it's really that simple!*/

unsigned int CRC (unsigned char * Data,
unsigned int Length)
{
CRC.Part.Remainder = INITIAL_VALUE;
while (Length-- > 0)
PutCRC(*Data++);
PutCRC(0);
PutCRC(0);
return CRC_buffer.Part.Remainder;
}

AltStyle によって変換されたページ (->オリジナル) /