有那位高手能告诉我这个函数是干什么的?返回值是什么? 我不知道是不是,哦,对了,什么是CRC呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CRC文件指纹校验函数,用于区别文件用的,返回的是校验码。 看名字应该是计算CRC啊,这是查表法,另外还有直接的计算方法,如下://①置16位寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器。//②把一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器。//③把寄存器的内容右移一位,用0填补最高位,检查最低位(移出位)。//④如果最低位为0:重复第③步(再次移位)。// 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)异或。//⑤重复步骤③和④,直到右移8次,这样整个8位数据全部进行了处理。//⑥重复步骤②和⑤,进行下一个8位的处理。//⑦最后得到的CRC寄存器即为CRC码。WORD CXComm::CRC16(unsigned char * pBuf, int nLength){ WORD wReturn = WORD(0xFFFF); for(int nDataLen = 0; nDataLen < nLength; nDataLen++) { wReturn ^= WORD(BYTE(pBuf[nDataLen])); for(int nIndex = 0; nIndex < 8; nIndex++) { if(wReturn & 1) { wReturn >>= 1; wReturn ^= 0xA001; } else { wReturn >>= 1; } } } return wReturn;} CRC检测 使用RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消息的内容。 CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到 消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。 CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值 进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。 CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位 以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个 过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中 的值,是消息中所有的字节都执行之后的CRC值。 CRC添加到消息中时,低字节先加入,然后高字节。 局域网和互联网 IOCP只能用CreateThread? 知道各自的外网IP和端口能否建立链接 怎样用vc关闭一个ShellExecute打开的文件! 求助在编译时发现错误cannot add two pointers 如何实现登陆后跳到带菜单的主界面 两个简单的问题! 得道成×××猩×××,又成了masterz手下的一个兵——来者有分! 堆和栈是怎么会事,用来干什么用?请大家深刻的帮我讲解一下。 求高手解释下,窗口回调函数产生的问题 请教如何以静态链接的方式使用msvcp71.dll和msvcr71.dll 请高手指点!关于输入重定向的问题?
//②把一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器。
//③把寄存器的内容右移一位,用0填补最高位,检查最低位(移出位)。
//④如果最低位为0:重复第③步(再次移位)。
// 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)异或。
//⑤重复步骤③和④,直到右移8次,这样整个8位数据全部进行了处理。
//⑥重复步骤②和⑤,进行下一个8位的处理。
//⑦最后得到的CRC寄存器即为CRC码。WORD CXComm::CRC16(unsigned char * pBuf, int nLength)
{
WORD wReturn = WORD(0xFFFF);
for(int nDataLen = 0; nDataLen < nLength; nDataLen++)
{
wReturn ^= WORD(BYTE(pBuf[nDataLen]));
for(int nIndex = 0; nIndex < 8; nIndex++)
{
if(wReturn & 1)
{
wReturn >>= 1;
wReturn ^= 0xA001;
}
else
{
wReturn >>= 1;
}
}
}
return wReturn;
}
使用RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消息的内容。
CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到
消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值
进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位
以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个
过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中
的值,是消息中所有的字节都执行之后的CRC值。
CRC添加到消息中时,低字节先加入,然后高字节。