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

WBOY
Lepaskan: 2016-06-13 12:00:11
asal
927 orang telah melayarinya

请问这个 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 />	}
Salin selepas log masuk

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 /> }
Salin selepas log masuk

------解决方案--------------------
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 运行的几组结果
Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan