php crc16 移位算法 急急急!

function crc16($string,$crc=0xffff) {

for ( $x=0; $x<strlen( $string ); $x++ ) {

$crc = $crc ^ ord( $string[$x] );
for ($y = 0; $y < 8; $y++) {

if ( ($crc & 0x0001) == 0x0001 )
$crc = ( ($crc >> 1 ) ^ 0xA001 );
else
$crc = $crc >> 1;
}
}

return $crc;
}
这个是php的crc16位,我在验证数据的时候,比方对方算出来是a1b2 我算出来的就是b2a1,后来听说是前八位后八位顺序倒换一下,但是我不会啊,
求高手帮忙!急急急,平常很少涉及到这方面,所以这个东西,看不懂也改不了~希望大神能在帮我改了的情况,顺嘴在给我说说这个函数的思路跟意思
后来对方告诉我说:"这里明显有位操作和移位操作阿,在返回值前增加如($CRC>>8)^($CRC<<8),试试!"
我也不知道这是啥,求大神帮忙了!!!

crc16校验计算过程:
1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
注意:该步检查LSB应该是右移前的LSB,即第3步前的LSB。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.然后将数据的第二、三、四。。。N个8-bit字符。。。重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。

理论上这样就完成了。
至于你说的前八位和后八位顺序倒换一下,其实就是$crc=($crc>>8)^($crc<<8),这样就倒换过来了。

修改以后的代码为:
function crc16($string,$crc=0xffff) {

for ( $x=0; $x<strlen( $string ); $x++ )
{
$crc = $crc ^ ord( $string[$x] );
for ($y = 0; $y < 8; $y++)
{
if ( ($crc & 0x0001) == 0x0001 )
$crc = ( ($crc >> 1 ) ^ 0xA001 );
else
$crc = $crc >> 1;
}
}
$crc = ($crc>>8) ^ ($crc<<8);
return $crc;
}

如果你位运算的基础不好的话,建议先理解位运算。
参考资料:
crc:http://baike.baidu.com/view/80377.htm#2
位运算:http://baike.baidu.com/view/379209.htm
希望有帮助到你。
温馨提示:内容为网友见解,仅供参考
无其他回答

php crc16 移位算法 急急急!
1.设置CRC寄存器,并给其赋值FFFF(hex)。2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。注意:该步检查LSB应该是右移前的LSB,即第3...

CRC-16 计算方法及程序设计
1. 初始化16位CRC寄存器为全1(0xFFFFH)。2. 对数据帧的第一个字节的8位进行异或操作,将结果存回寄存器。3. 移位操作:将寄存器右移一位,高位补0,低位丢弃并检测。4. 若低位为1,则寄存器与预设值0xA001进行异或;否则,仅做右移。5. 重复步骤3和4,直至完成8次移位,处理一个完整的8位...

crc16的校验码的算法
方法如下:CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0), 之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出...

crc16校验代码中 多项式码明明是8005 为什么要用A001来异或,还有CRC16...
正向校验高位在左,反向校验低位在左,比如正向CRC校验的数据为0xAF5D=1010 1111 0101 1101B与0x8005异或时应该是0xAF5D^0x8005,而要使用0xA001与数据进行校验也应该使0xAF5D高低位换顺序为0xBAF5=1011 1010 1111 0101B。正向校验使用左移位,反向校验使用右移位,其实原理是一样的,得看校验的数...

CRC-8和CRC-16算法
计算CRC8时,先将数据左移8位,然后逐位与生成多项式的二进制形式进行异或运算。对于每个字节,可能需要进行多次判断、移位和异或操作。使用查表法可以简化计算,预先计算所有字节的CRC结果,查询时直接获取,大大减少计算量。CRC16是CRC校验的另一种版本,它有多种标准,如CRC16_CCITT、CRC16_XMODEM等,...

crc 16 delphi 算法!
为什么不在网上找一下呢?CRC一般常用的有查表法。以前我做一个串口传输入程序的时候,就是在网上找的源代码。然后自己稍稍改了一下就OK了。如果是用计算法的话,说老实话,我也不太明白。呵呵。不过真正应用的时候,重要的是结果。

关于CRC算法,高手赐教
CRCs经常被叫做“校验和”,但是这样的说法严格来说并不是准确的,因为技术上来说,校验“和”是通过加法来计算的,而不是CRC这里的除法。“错误纠正编码”常常和CRCs紧密相关,其语序纠正在传输过程中所产生的错误。这些编码方式常常和数学原理紧密相关。CRC有几种不同的变体,包括逆向使用移位寄存器、...

高手解释下crc的具体算法和用法?
1.设置CRC寄存器,并给其赋值FFFF(hex)。2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。5.重复第3与第4步直到8次移位全部完成。此时...

CRC16校验码如何计算
1.设置CRC寄存器,并给其赋值FFFF(hex)。2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。5.重复第3与第4步直到8次移位全部完成。

关于CRC算法,高手赐教
* 移位寄存器可以初始化成 1 而不是 0。同样,在用算法处理之前,消息的最初 <math>n<\/math> 个数据位要取反。这是因为未经修改的 CRC 无法区分只有起始 0 的个数不同的两条消息。而经过这样的取反过程,CRC 就可以正确地分辨这些消息了。* CRC 在附加到消息数据流的时候可以进行取反。这样,CRC 的检查...

相似回答