CRC校验
多项式:g(x)=1+x+x 3
初始值:“111”
#define CRC_ORDER 3 /* Bits in CRC. */
#define CRC_POLYNOM 0x3 /* 1011 without top bit. */
#define CRC_DIRECT_INIT 0x02 /* Augmented "7" is "2" direct. */
#define CRC_CRCXOR 0
#define CRC_CRCMASK (((((unsigned long)1 << (CRC_ORDER - 1)) - 1) << 1) | 1)
#define CRC_CRCHIGHBIT ((unsigned long)1 << (CRC_ORDER - 1))
static unsigned long _crc_(unsigned long msg, unsigned long bitlen)
{
// fast bit by bit algorithm without augmented zero bytes.
// does not use lookup table, suited for polynom orders between 1...32.
unsigned long c, bit;
unsigned long crc = CRC_DIRECT_INIT;
c = msg;
while (bitlen-- > 0) {
bit = crc & CRC_CRCHIGHBIT;
crc <<= 1;
if (c & 0x80000000) bit ^= CRC_CRCHIGHBIT;
if (bit) crc ^= CRC_POLYNOM;
c <<= 1;
}
crc ^= CRC_CRCXOR;
crc &= CRC_CRCMASK;
return(crc);
}