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 1111101
即 0111100
。在 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
*/
我在 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 1111101
即 0111100
。在 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
*/