运行结果result应该为C40B,但是这个Crc校验函数得到的是660,求修改
计算CRC码的步骤为:
1、 预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;
2、 把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;
3、 把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
4、 如果最低位为0:重复第3步(再次移位)
如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5、 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
6、 重复步骤2到步骤5,进行下一个8位数据的处理;
7、 最后得到的CRC寄存器即为CRC码。
8、 将CRC结果放入信息帧时,将高低位交换,低位在前。
int main(int argc, char* argv[])
{
unsigned char ch[6];
unsigned short result;
result=0xffff;
ch[0]=1;
ch[1]=3;
ch[2]=0;
ch[3]=0;
ch[4]=0;
ch[5]=2;
result=crc_check(result,ch,6);
printf("%x\n",result);
return 0;
}
int crc_check(unsigned short crc, unsigned char * ch,int nLen)
{
unsigned short data;
for(int j=0 ; j<nLen ; j++)
{
data=*ch;
ch++;
crc |=((crc &0xFF)^data); //2- 8位数据与16位CRC寄存器的低位相异或
for(int i= 0; i<8; ++i)
{
crc >>= 1; //3- 寄存器的内容右移一位(朝低位)
crc &=0x7fff;
if ((crc & 0x1))
crc ^= 0xA001; //4- 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
}
}
return crc;
}
计算CRC码的步骤为:
1、 预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;
2、 把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;
3、 把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
4、 如果最低位为0:重复第3步(再次移位)
如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5、 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
6、 重复步骤2到步骤5,进行下一个8位数据的处理;
7、 最后得到的CRC寄存器即为CRC码。
8、 将CRC结果放入信息帧时,将高低位交换,低位在前。
int main(int argc, char* argv[])
{
unsigned char ch[6];
unsigned short result;
result=0xffff;
ch[0]=1;
ch[1]=3;
ch[2]=0;
ch[3]=0;
ch[4]=0;
ch[5]=2;
result=crc_check(result,ch,6);
printf("%x\n",result);
return 0;
}
int crc_check(unsigned short crc, unsigned char * ch,int nLen)
{
unsigned short data;
for(int j=0 ; j<nLen ; j++)
{
data=*ch;
ch++;
crc |=((crc &0xFF)^data); //2- 8位数据与16位CRC寄存器的低位相异或
for(int i= 0; i<8; ++i)
{
crc >>= 1; //3- 寄存器的内容右移一位(朝低位)
crc &=0x7fff;
if ((crc & 0x1))
crc ^= 0xA001; //4- 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
}
}
return crc;
}
解决方案 »
- IOCP编程Post一个AcceptEx,收到客户端连接的事件后,怎么样取得客户端的地址和端口?
- 到底什么样的是系统级线程???
- 弱问,VS2003 如何设置窗口样式为WS_CLIPCHILDREN。
- 我捕获Windows Media Player的编码器错误信息的时候,老报错?
- !!!!!!如何使用xslt判断xml文件中一个节点是否存在,在线等
- 如何在程序中关闭当前窗口?
- 一个很奇怪的问题???
- 大家好!!!
- SDK中可以分割窗口马
- 谁知道hhp文件的格式?
- 用odbc读取excel中的数据时,如何指定数据是什么类型的
- generate browse info 选择项就该选中吗?选与不选区别何在呢?
==这是干啥?把高位去掉吗?可协议中没有这么说啊,只是低位异或啊。
crc = (crc & 0xFF00) | ((crc &0xFF)^data);
可以到这里领分。发帖用[救济]开头就能得到200分。
{
//unsigned short data;
unsigned char data;
for(int j=0 ; j<nLen ; j++)
{
data=*ch;
ch++;
crc=(crc & 0xFF00) | ((crc &0xFF)^data); //2- 8位数据与16位CRC寄存器的低位相异或
for(int i= 0; i<8; ++i)
{
crc >>= 1; //3- 寄存器的内容右移一位(朝低位)
crc &=0x7fff;
/*if ((crc & 0x1))
crc ^= 0xA001; */ //4- 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
while(!(crc & 0x1))
crc >>=1;
crc ^= 0xA001;
}
}
return crc;
}
int crc_check(unsigned short crc, unsigned char * ch,int nLen)
{
//unsigned short data;
unsigned char data;
unsigned char btag;
for(int j=0 ; j<nLen ; j++)
{
data=*ch;
ch++;
crc=(crc & 0xFF00) | ((crc &0xFF)^data); //2- 8位数据与16位CRC寄存器的低位相异或
for(int i= 0; i<8; ++i)
{
btag=crc&0x0001;
crc >>= 1; //3- 寄存器的内容右移一位(朝低位)
crc &=0x7fff;
if (btag)
crc ^= 0xA001; //4- 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
}
}
return crc;
}