CRC16校验时,不管传入什么数据进去,得到的校验结果都不变,请高手支招,多谢
CRC16校验时,不管传入什么数据进去,得到的校验结果都不变,请高手支招,谢谢
我是服务端接收到客户端发来的数据,数据格式如下
AAAAAA000130303131313130323036303930303031473130324C323036303230323235000001D6070811050F00050E09FEEEE
其中AAAA,EEEE为帧头帧尾,帧尾前4个字符为CRC校验码,需要校验的字符串为去掉帧头帧尾,CRC校验码三部分的剩余字符串。
问题:每次我修改客户端数据包内容发送给服务端时,CRC16验证的结果都不变,都是6224,请高手指点。纠结一天了,会不会是只要数据包没误码,CRC16结果就不会变呢?
------解决方案--------------------
虽然没有仔细看代码,但猜测是sizeof(CRCCodeChar)引起的,字符串指针sizeof在64位下怎么都是8。也许你应该用是strlen(),不过因为串内可能会有0x00的字符,所以最好还是由发送方告诉你长度。
------解决方案--------------------
很长时间没有用crc了,刚刚搜了一下,http://zhidao.baidu.com/question/427505041.html这个链接里的就是你的代码,因为是查表法,所以两个表不能忘了。
------解决方案--------------------
/////////////////////////////////CRC校验函数 ////////////////////////////////////
unsigned short CRC16(const char *puchMsg, int usDataLen)
{
unsigned short uchCRCHi = 0xFF;
unsigned short uchCRCLo = 0xFF;
unsigned uIndex;
while (usDataLen--)
{
uIndex = uchCRCLo ^ *puchMsg++;
uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex];
uchCRCHi = auchCRCLo[uIndex];
}
return (uchCRCHi << 8 | uchCRCLo);
}
CRC16(CRCCodeChar,sizeof(CRCCodeChar));// 在这里调用,传入的是一个字符串和它的长度
我是服务端接收到客户端发来的数据,数据格式如下
AAAAAA000130303131313130323036303930303031473130324C323036303230323235000001D6070811050F00050E09FEEEE
其中AAAA,EEEE为帧头帧尾,帧尾前4个字符为CRC校验码,需要校验的字符串为去掉帧头帧尾,CRC校验码三部分的剩余字符串。
问题:每次我修改客户端数据包内容发送给服务端时,CRC16验证的结果都不变,都是6224,请高手指点。纠结一天了,会不会是只要数据包没误码,CRC16结果就不会变呢?
------解决方案--------------------
虽然没有仔细看代码,但猜测是sizeof(CRCCodeChar)引起的,字符串指针sizeof在64位下怎么都是8。也许你应该用是strlen(),不过因为串内可能会有0x00的字符,所以最好还是由发送方告诉你长度。
------解决方案--------------------
很长时间没有用crc了,刚刚搜了一下,http://zhidao.baidu.com/question/427505041.html这个链接里的就是你的代码,因为是查表法,所以两个表不能忘了。
------解决方案--------------------
unsigned short CRC16(unsigned char *buf,int len) {
unsigned short CRC = 0xffffu;
int i,j;
for (i=0;i<len;i++) {
CRC ^= *buf++;
for (j=0;j<8;j++) {
if (CRC & 0x0001u)
CRC = CRC >> 1^0xA001u;
else
CRC >>= 1;
}
}
CRC = ((CRC << 8) & 0xFF00u)
------解决方案--------------------
((CRC >> 8) & 0x00FFu);
return CRC;
}