求助大神:
现在用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的使用理解出了问题?
现在用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的使用理解出了问题?
解决方案 »
- 用什么编辑php文件啊?
- 如何将以下数组分开同时显示出来
- 我最近做了一个网站,请高手指点一下网址供上!
- 我想问一下,关于google限制查询的问题。
- 自从学.net就发觉自己整天在学新技术,新名词了,很少有时间把精力集中到具体业务编程上。
- php 安装配置问题。
- register_tick_function 似乎有问题
- 如何让HTMl代码能像一般的字符这样在页面显示出来吗???
- 关于javascript调用php问题,急,,高分!
- 如何让中文的文件名做联接? 高分相送
- php7.1.5提示Call to undefined function sqlsrv_connect()
- PHP本地运行没有问题,上传到linux服务器后所有的css、js加载失败,跪求大神
应为 return dechex($crc);你的运算过程都是基于十进制的,如要得到十六进制的结果,就需要做数制转换
现在通过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。如下图:
请问是我们抄袭的算法有问题,还是代入的输入输出值有问题,或是其他呢?