一个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错误。

posted @ 2014-07-16 03:06  Robird  阅读(481)  评论(0)    收藏  举报