一个crc8实例
//Crc8 0x8C <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< static const u8 crcTbl_0x8C_4[16] = { 0x00,0x9D,0x23,0xBE,0x46,0xDB,0x65,0xF8,0x8C,0x11,0xAF,0x32,0xCA,0x57,0xE9,0x74, }; static u32 crc0x8C(u32 data){ int i = 24>>2; do { data = crcTbl_0x8C_4[data & 15] ^ (data >> 4); } while (0 != --i); return data; } static const u8 _correctTable0x8C[32] = { 0xAB, 0x4F, 0x9E, 0x25, 0x4A, 0x94, 0x31, 0x62, 0xC4, 0x91, 0x3B, 0x76, 0xEC, 0xC1, 0x9B, 0x2F, 0x5E, 0xBC, 0x61, 0xC2, 0x9D, 0x23, 0x46, 0x8C, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, }; static int TryCorrect0x8C(u32 *errData, u8 rem) { int i = 31; do { if (_correctTable0x8C[i] == rem) { *errData ^= ((u32)1 << i); break; } } while (0 != i--); return i; } static int CorrectOrCorrectable(u32 *data) { u8 rem = (u8)crc0x8C(*data); return (0 == rem) || 0 <= TryCorrect0x8C(data, rem); }
32bit物理数据中包括24bit载荷和8bitcrc8。可以纠正1bit错误。
浙公网安备 33010602011771号