这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » CRC 刚写的CRC校验(c),讨论交流一下

共2条 1/1 1 跳转至

CRC 刚写的CRC校验(c),讨论交流一下

院士
2006-09-17 18:14:16     打赏
CRC 刚写的CRC校验(c),讨论交流一下



关键词: 写的     校验     讨论     交流     一下    

院士
2006-12-22 22:43:00     打赏
2楼
CRC VALUE INPUT VALUE
01100001 0 _______
10111100 0
01011110 0
00101111 1 C
00010111 1 _______
00001011 1
00000101 0
10001110 0 1
01000111 0 _______
10101111
我根据以上CRC经过校验之后的运算结果,(我不知道CRC校验的原理是什么)写的两个校验函数,熟悉CRC校验法则的可以帮我看看,一起讨论讨论。
若A位一个unsigned char,发现A值与它自己本身经过CRC校验之后,A值为0^-^

一个函数是8位的CRC校验,另一个函数为16位的CRC校验
分别为:CRC8=X8+X5+X4+1和CRC16=X16+X15+X5+1

#define SetBit(var,thisBit) ( var|=(1<<thisBit) )
#define ClrBit(var,thisBit) ( var&=(0xff-(1<<thisBit)) )
#define CompBit(var,thisBit) ( var^=(1<<thisBit))
#define GetBit(var,thisBit) ( var&(1<<thisBit) )

void Crc8Value(U08 *crc,U08 dat)
{
U08 loop;
U08 crcTemp;
BOOL bitTemp;
    for(loop=0; loop<8; loop++)
    {
        crcTemp = *crc;
        (*crc) >>=1;
        bitTemp = (crcTemp&0x01)^(dat&0x01);
        if(bitTemp)
        {
            if(crcTemp&0x08)    ClrBit(*crc,2);
            else                SetBit(*crc,2);
            if(crcTemp&0x10)    ClrBit(*crc,3);
            else                SetBit(*crc,3);
            (*crc) |= 0x80;
        }
        else
        {
            if(crcTemp&0x08)    SetBit(*crc,2);
            else                ClrBit(*crc,2);
            if(crcTemp&0x10)    SetBit(*crc,3);
            else                ClrBit(*crc,3);
            (*crc) &= 0x7f;
        }

        dat >>= 1;
    }
}


void Crc16Value(U16 *crc,U08 dat)
{
U08 loop;
U16 crcTemp;
BOOL bitTemp;
    for(loop=0; loop<8; loop++)
    {
        crcTemp = *crc;
        (*crc) >>=1;
        bitTemp = (crcTemp&0x01)^(dat&0x01);
        if(bitTemp)
        {
            if(crcTemp&0x0002)    *crc &= 0xfffe;
            else                *crc |= 0x0001;
            if(crcTemp&0x4000)    *crc &= 0xdfff;
            else                *crc |= 0x2000;
            (*crc) |= 0x8000;
        }
        else
        {
            if(crcTemp&0x0002)    *crc |= 0x0001;
            else                *crc &= 0xfffe;
            if(crcTemp&0x4000)    *crc |= 0x2000;
            else                *crc &= 0xdfff;
            (*crc) &= 0x7fff;
        }

        dat >>= 1;
    }
} 1: 网上网上不是有很多这方面的讨论了吗?

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]