求助大神:
现在用php抄袭了crc16 CCITT的算法,网上找到了如下代码资料:
<?php
function crc16($data)
 {
   $crc = 0xFFFF;
   for ($i = 0; $i < strlen($data); $i++)
   {
     $x = (($crc >> 8) ^ ord($data[$i])) & 0xFF;
     $x ^= $x >> 4;
     $crc = (($crc << 8) ^ ($x << 12) ^ ($x << 5) ^ $x) & 0xFFFF;
   }
   return $crc;
 }
?>出处:https://stackoverflow.com/questions/14018508/how-to-calculate-crc16-in-php
不论我传输怎样的数据给$data,返回的结果永远都是5个十六进制数字。代码运行结果如下图:
$data赋值123456100141,返回结果是34041
算法原理上来讲,crc16算出的结果一定是2位,即4个十六进制数字。
我又找了很多php crc16网上的算法,结果都是5个十六进制数字。这让我很疑惑?
而且我还有一点不太明白,为什么要用ord($data[$i]),将$data转换为ASCII码?再跟十六进制进行异或操作?十六进制不是应该只和十六进制异或才对吧?
求大神讲解其中的问题,是不是我对于$data的使用理解出了问题?

解决方案 »

  1.   

    return $crc;
    应为 return dechex($crc);你的运算过程都是基于十进制的,如要得到十六进制的结果,就需要做数制转换
      

  2.   

    感谢徐老师您的解答:
    现在通过dechex方法,已经把十进制转成十六进制了,犯了如此低级的错误。现在我还是些问题希望您能解答:
    1、$crc初始化时是16进制,return时会是十进制?
    2、如果return $crc是十进制,那传参$data是什么类型?也是十进制吗?3、我们现在传入的$data数据是:123456100141,通过您的指导,返回时用return dechex($crc),返回了0x84f9。
    但是我们通过在线crc计算网站,http://www.ip33.com/crc.html,选择CRC16/CCITT计算的结果是0x45E1。如下图:
    请问是我们抄袭的算法有问题,还是代入的输入输出值有问题,或是其他呢?