crc校验问题

来源:百度知道 编辑:UC知道 时间:2024/05/23 19:56:59
这是一个crc校验程序:typedef unsigned char uchar;
typedef unsigned int uint;
code uchar crcbuff [] = { 0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};
uint crc; // CRC 码
void main(void)
{
uchar *ptr;
crc = 0; // CRC 初值
ptr = crcbuff; // 指向第一个Byte 数据
crc = crc16l(ptr,8);
while(1);
}
uint crc16l(uchar *ptr,uchar len) // ptr 为数据指针,len 为数据长度
{
uchar i;
while(len--)
{
for(i=0x80; i!=0; i>>=1)
{
if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;} 1-1
else crc<<=1; 1-2
if((*ptr&i)!=0) crc^=0x1021; 1-3
}
ptr++;
}
return(crc);
}

我不明白0x1021代表什么?哪位大侠知道请告诉我,谢谢~
现在知道0x1021代表的是求CRC校验码所用的一个多项表达式(即权).我知道是怎么求CRC的,他的数学表达式是很清楚,用模2除的方式,但程序中用的是异或运算,难道模2除在程序中是用异或运算来表示的吗?谁能帮我详细解释一下uint crc16l(uchar *ptr,uchar len)这个函数!万分谢谢!

0X1021 是一个16进制数,转换为十进制为4129,
二进制为00010000 00100001

存入CRC校验码中,高八位与低八位分开放,为buf[]={0X10,0X21};

你要是知道CRC怎么算的,请更新问题。我回来看,交流一下。我也弄CRC校验码呢。

uint crc16l(uchar *ptr,uchar len)
就是一个宏么,uchar *ptr指定数组,len是长度。你的crc算出来了?把代码发出来呗,我看看。还有CRC计算是,是整个发送的数组还是除去消息开始标识和结束标识?

0x1021代表一个十六进制数,即1021