Home >Backend Development >PHP Tutorial >请教这个 crc 16 的java代码怎么转换成php的

请教这个 crc 16 的java代码怎么转换成php的

WBOY
WBOYOriginal
2016-06-13 12:00:11953browse

请问这个 crc 16 的java代码如何转换成php的

本帖最后由 oelenson 于 2014-06-21 12:49:27 编辑 请问这个 crc 16 的java代码如何转换成php的,自己用php 转的代码不对

$str2='AQEBAQEB';
$str2=base64_decode($str2); 


java 代码

public static int CRC16(final byte[] buffer) {<br />		int crc = 0xffff;<br /><br />		for (int i = 0; i < buffer.length; i++) {<br />			crc = ((crc >>> 8) | (crc << 8)) & 0xffff;<br />			crc ^= (buffer[i] & 0xff);<br />			crc ^= ((crc & 0xff) >> 4);<br />			crc ^= (crc << 12) & 0xffff;<br />			crc ^= ((crc & 0xff) << 5) & 0xffff;<br />		}<br />		crc &= 0xffff;<br /><br />		return crc;<br />	}

function uRShift($a, $b)<br />{<br />    if($b == 0) return $a;<br />    return ($a >> $b) & ~(1<<(8*PHP_INT_SIZE-1)>>($b-1));<br />} <br /><br /><br /><br />function crc16($buffer) {<br /> $crc = 0xffff;<br /> for ($i = 0; $i < strlen($buffer); $i++) {<br /> $crc = ((uRShift($crc,8)) | ($crc << 8)) & 0xffff;<br /> $crc ^= ($buffer[$i] & 0xff);<br /> $crc ^= (($crc & 0xff) >> 4);<br /> $crc ^= ($crc << 12) & 0xffff;<br /> $crc ^= (($crc & 0xff) << 5) & 0xffff;<br /> }<br /> $crc &= 0xffff;<br /><br /> return $crc;<br /> }

------解决方案--------------------
java 的 >>> (左补0右移) 在 php 中不需特殊处理,可直接 >>
至多将 (crc >>> 8) 译为 (($crc >> 8) & 0xff) 

java 的 byte[] 类型,没有对应的 php 数据类型
你可以逐字节取内码 ord($buffer[$i]) 
也可以一进函数就 $buffer = array_values(unpack('C', $buffer));
unpack('C', $buffer) 返回的数组是从下标 1 开始的,所以要 array_values 整理一下
如果用 foreach 循环,或 for 循环从 1 开始就不需要整理了

其他应该没什么了

如果觉得还有问题,请给出 java 运行的几组结果
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn