- 論壇徽章:
- 0
|
今日遇到一個需要crc計(jì)算的地方,于是找crc函數(shù),發(fā)現(xiàn)如后付的兩個crc函數(shù)?墒俏椅菇o他們同樣的數(shù)據(jù)卻得到不同的結(jié)果
我對比以前找到的其他函數(shù),正向計(jì)算的結(jié)果互相一致,逆向計(jì)算的結(jié)果也互相一致。
想請教,如果我發(fā)的數(shù)據(jù)相同,比如我現(xiàn)在通過串口發(fā)送的序列0xaa0xaa 0x7e 0x01,公式ccitt 即多項(xiàng)式為1021(逆向后為804
是否他們計(jì)算的結(jié)果確實(shí)是不一致的,還是他們應(yīng)該算出一致的結(jié)果來?
crc16l算出0xc3f7
crc16r算出0x7963
//-------------------------------------------------------------------------------------------------------------------------
網(wǎng)頁摘來的函數(shù)
u_short crc16l(u_char *ptr,u_char len,u_short key) // ptr 為數(shù)據(jù)指針,len 為數(shù)據(jù)長度
{
u_char i;
u_short crc=0x0000;
while(len--)
{
for(i=0x80; i!=0; i>>=1)
{
if((crc&0x8000)!=0) {crc<<=1; crc^=key;}
else crc<<=1;
if((*ptr&i)!=0) crc^=key;
}
ptr++;
}
return(crc);
}
!反轉(zhuǎn)多項(xiàng)式是指在數(shù)據(jù)通訊時(shí),信息字節(jié)先傳送或接收低位字節(jié),如重新排位影響 CRC
計(jì)算速度,故設(shè)反轉(zhuǎn)多項(xiàng)式。!如CRC16 1021的反轉(zhuǎn)多項(xiàng)式是8408
u_short crc16r(u_char *ptr, u_char len,u_short key)
{
unsigned char i;
u_short crc=0x0000;
while(len--!=0)
{
for(i=0x01;i!=0;i <<= 1)
{
if((crc&0x0001)!=0) {crc >>= 1; crc ^= key;}
else crc >>= 1;
if((*ptr&i)!=0) crc ^= key;
}
ptr++;
}
return(crc);
} |
|