From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/crc-16.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/crc-16.c (limited to 'reference/C/CONTRIB/SNIP/crc-16.c') diff --git a/reference/C/CONTRIB/SNIP/crc-16.c b/reference/C/CONTRIB/SNIP/crc-16.c new file mode 100755 index 0000000..e1f3165 --- /dev/null +++ b/reference/C/CONTRIB/SNIP/crc-16.c @@ -0,0 +1,37 @@ +#define POLY 0x8408 +/* +// 16 12 5 +// this is the CCITT CRC 16 polynomial X + X + X + 1. +// This works out to be 0x1021, but the way the algorithm works +// lets us use 0x8408 (the reverse of the bit pattern). The high +// bit is always assumed to be set, thus we only use 16 bits to +// represent the 17 bit value. +*/ + +unsigned short crc16(char *data_p, unsigned short length) +{ + unsigned char i; + unsigned int data; + unsigned int crc = 0xffff; + + if (length == 0) + return (~crc); + + do + { + for (i=0, data=(unsigned int)0xff & *data_p++; + i < 8; + i++, data >>= 1) + { + if ((crc & 0x0001) ^ (data & 0x0001)) + crc = (crc >> 1) ^ POLY; + else crc >>= 1; + } + } while (--length); + + crc = ~crc; + data = crc; + crc = (crc << 8) | (data >> 8 & 0xff); + + return (crc); +} -- cgit v1.2.3-54-g00ecf