Xoring PHP 中的两个字符?

Xoring Two characters in PHP?

我在 php 中阅读有关 xor 的内容,我看到了这个例子:

$aa = "A" ^ "}"; 
echo $aa; // <

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

A = 65
} = 125 

65 + 125 = 190

我试着在其他字符之间求和,比如

$aa = "A" ^ "&";
echo $aa;

但是结果是130 = g

所以大于 97 的任何字符都不是总和吗?

我也检查了这个问题,但它对我没有帮助。

A ascii => 65 十进制 => 1000001 二进制。

} ascii => 125 十进制 => 1111101 二进制。

然后我们做 1000001 xor 11111010111100。在 A} 中设置但未同时设置的位。

0111100 二进制 => 60 十进制 => < 在 ascii 中。

^ 异或 运算符,这意味着我们实际上是在处理二进制值。那么让我们分解一下会发生什么。

二进制值的 XOR 运算符将 return 1 其中只有一位为 1,否则 returns 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

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

$binary_first = decbin($ascii_first);   // 1000001
$binary_second = decbin($ascii_second); // 1111101

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

first      1000001
           ^
second     1111101
-------------------
result     0111100

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

$final_ascii = bindec("0111100");   // 60

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

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

如果将异或运算符应用于字符串,可能会生成无法打印的字符。 echo returns 不完整/不正确的问题在这里。以bin2hex为输出。

函数 xorStrings 提供与字符串 XOR 相同的结果,编写它只是为了理解对字符串进行 Operator XOR。

function xorStrings($str1,$str2){
  $res = "";
  $len = min(strlen($str1),strlen($str2));
  for($i=0; $i<$len;$i++){
    $intStr1 = ord($str1[$i]);
    $intStr2 = ord($str2[$i]);
    $res .= chr($intStr1 ^ $intStr2);
  } 
  return $res;
}

$aa = "Ab" ^ "}bc";
$af = xorStrings("Ab", "}bc");
echo bin2hex($aa)."<br>\n";
echo bin2hex($af)."<br>\n";
/* Output
3c00
3c00
*/