0

JS 按位 XOR 运算符的行为是否与 PHP 的对应运算符不同?我在 JS 和 PHP 中收到相同操作的不同结果。

这是 PHP 代码。^如果逐个字符进行XOR 位运算符,则最终数组完全包含结果。它不同于 Node.js 的按位异或:

$b = hex2bin('db6dc3f86800da4f7c19e643e8941ebb');
$md5raw = md5($b, TRUE);

/* for the sake of verification with JS - the result is the same */
$h = bin2hex($md5raw); // => b885730327999e8823d113161c3538d3


$string = "1234567";
$string .= "\x00";
$len = 16;

$result = '';
$arr = array();
for ($i = 0; $i < strlen($string); $i++) {
    $result .= $string[$i] ^ $md5raw[$i % $len];
    array_push($arr, bin2hex($result));
}

print_r(bin2hex($result)); // => 89b7403712afa988
Array
(
    [0] => 89
    [1] => 89b7
    [2] => 89b740
    [3] => 89b74037
    [4] => 89b7403712
    [5] => 89b7403712af
    [6] => 89b7403712afa9
    [7] => 89b7403712afa988
)

这是 Node.js 等价于上面的 PHP 代码。这是代码https://repl.it/JjPV/0的链接。但由于某种原因,它在该编译器中不起作用。但是它适用于本地 Node.js 安装。

这是一个没有函数的代码(为了节省空间;函数在repl.it链接中)。并且按位的结果是不同的。为什么会这样?如何使其与 PHP 返回相同?

let b = hex2bin('db6dc3f86800da4f7c19e643e8941ebb');
let md5hex = md5(b);  // => b885730327999e8823d113161c3538d3
let md5raw = new Buffer(md5hex, "hex").toString('binary'); // to raw binary like in PHP md5(val, TRUE);

let string = "1234567"
string += "\x00";
let len = 16;

let result = '';
let arr = [];
for (let i = 0; i < string.length; i++) {
    result += string[i] ^ md5raw[i % len];
    arr.push(bin2hex(result));
}

console.log(bin2hex(result)) // => 31313031313132353733
console.log(arr);
[ '31',
  '313130',
  '3131303131',
  '313130313131',
  '31313031313132',
  '3131303131313235',
  '313130313131323537',
  '31313031313132353733' ]
4

0 回答 0