我正在尝试将一个非常简单的函数从NodeJs转换为PHP。我想我找到了如何转换80%的代码,但是我被位运算符卡住了。
这是原始的NodeJs脚本:
function convert(encodedString) {
let bytes = new Buffer.from(encodedString, 'base64')
let code = bytes[bytes.length - 1]
code ^= 91
for (let i = 0; i < bytes.length - 1; ++i) {
bytes[i] = ((bytes[i] ^ (code << (i % 5))) | 0)
}
return bytes
}这是转换后的PHP版本
function convert($encoded)
{
$bytes = unpack('C*', base64_decode($encoded));
$code = $bytes[count($bytes)];
$code ^= 91;
for($i = 0; $i < count($bytes) - 1; ++$i) {
$bytes[$i + 1] = (($bytes[$i + 1] ^ ($code << ($i % 5))) | 0);
}
return $bytes;
}这以某种方式工作,直到按位部分。我得到了数组第一个元素的正确结果,但所有后续值都是错误的。我还必须调整索引,因为使用unpack方法可以得到一个基数为1的索引数组。
如果我在转换前循环每个数组的值,我会在两个脚本上得到相同的结果,所以我认为在此之前是正确的。
我能够在NodeJs上重现这个问题,例如,如果我定义了一个普通数组(具有相同的值),而不是使用Buffer。
我真的不知道如何在PHP中重现同样的行为。
如有任何帮助,我们不胜感激!
发布于 2020-04-09 00:18:36
Javascript和PHP中的位运算符处理计算的方式不同。
示例:
Javascript:
1085 << 24 = 1023410176PHP:
1085 << 24 = 18203279360Bitwise operations PHP and JS different
您应该在PHP中编写自己的位运算符函数。What is JavaScript's highest integer value that a number can go to without losing precision?
https://stackoverflow.com/questions/61104638
复制相似问题