PHP中的异或两个字符?

lea*_*n99 5 php bitwise-operators bitwise-xor

我在 php 阅读 xor ,我看到了这个例子:

$aa = "A" ^ "}"; 
echo $aa; // <
Run Code Online (Sandbox Code Playgroud)

所以我在互联网上搜索它是如何工作的,他们说它的总和是 ascii 代码,但上面的代码不是总和。

A = 65
} = 125 

65 + 125 = 190
Run Code Online (Sandbox Code Playgroud)

我试图在另一个字符之间求和

$aa = "A" ^ "&";
echo $aa;
Run Code Online (Sandbox Code Playgroud)

但结果是 130 = g

那么超过 97 的任何字符都不是总和吗?

我也检查了这个问题 PHP XOR 字符串,但它没有帮助我。

Qir*_*rel 5

^运算符,这意味着我们实际上正在使用二进制值。那么让我们来分析一下发生了什么。

二进制值上的 XOR 运算符将返回1只有一位为 1 的位置,否则返回 0 ( 0^0 = 0, 0^1 = 1, 1^0 = 1, 1^1 = 0)。

正如您自己所说,当您使用XOR字符时,您正在使用它们的 ASCII 值。这些 ASCII 值是整数,因此我们需要将它们转换为二进制以查看实际情况。让我们使用您的第一个示例,A并且}

$first = 'A';
$second = '}';

$ascii_first = ord($first);    // 65
$ascii_second = ord($second);  // 125
Run Code Online (Sandbox Code Playgroud)

然后我们使用该函数将它们转换为二进制decbin()

$binary_first = decbin($ascii_first);   // 1000001
$binary_second = decbin($ascii_second); // 1111101
Run Code Online (Sandbox Code Playgroud)

现在我们XOR对这些二进制值使用运算符。

first      1000001
           ^
second     1111101
-------------------
result     0111100
Run Code Online (Sandbox Code Playgroud)

我们看到得到的二进制值为0111100。使用该bindec()函数我们将其反转回整数值

$final_ascii = bindec("0111100");   // 60
Run Code Online (Sandbox Code Playgroud)

我们看到我们得到了整数值 60。使用chr(60)您将得到 ASCII 表中十进制值为 60 的字符 - 结果为<

这是一个显示步骤的现场演示:https://3v4l.org/Xd8SP - 您可以尝试一下,替换字符以查看不同字符组合的最终结果。