Home > Backend Development > PHP Tutorial > 请问这个 crc 16 的java代码如何转换成php的

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

WBOY
Release: 2016-06-23 13:54:59
Original
1072 people have browsed it

请问这个 crc 16 的java代码如何转换成php的,自己用php 转的代码不对

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


java 代码

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

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


回复讨论(解决方案)

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 运行的几组结果


$str2='AQEBAQEB';
$str2=base64_decode($str2);
java 得到的 结果是 8357
php 得到的结果是 33653

<?phpfunction crc16($buffer) {	$crc = 0xffff;	//$buffer = array_values(unpack('C', $buffer));	for ($i = 0; $i < strlen($buffer); $i++) {		$crc = ((($crc >> 8) & 0xff)  | ($crc << 8)) & 0xffff;		$crc ^= (ord($buffer[$i]) & 0xff);		$crc ^= (($crc & 0xff) >> 4);		$crc ^= ($crc << 12) & 0xffff;		$crc ^= (($crc & 0xff) << 5) & 0xffff;	}	$crc &= 0xffff;	return $crc;}$str=base64_decode('AQEBAQEBdYM=');$str2='AQEBAQEB';$str2=base64_decode($str2);$arr2=unpack('H*',$str2);$arr=unpack('H*',$str);print_r($arr);echo '-----------------------------------';echo crc16($str2);
Copy after login

为什么要 $str2=base64_decode($str2); 
java 里也做了 base64 编码了吗?

让你多给几组,为何只给一组呢?

谢谢已经搞好了

Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template