有人能向我解释一下这段PHP代码吗?单行代码产生意外结果


Can anyone explain this PHP code to me? Unexpected result from a single line of code

有人能解释一下PHP在这里做什么,以及是否可以获得可预测的结果吗?

这会被用来隐藏信息吗?

echo '1' | 'z';

它使用的是位OR运算符

'1' = ASCII 0x31 = Binary 00110001
'z' = ASCII 0x7A = Binary 01111010

将两者进行OR运算得到

  00110001  1
| 01111010  z
= 01111011  {

是0x7B是ASCII字符{

正如已经指出的,为了使这种可逆性,应该使用XOR而不是OR

将两者异或得到

  00110001  1
^ 01111010  z
= 01001011  K

是0x4B是ASCII字符K

倒车:

  01001011  K
^ 01111010  z
= 00110001  1

编辑

这不是一个特别强的代码,但是:

$plainTextMessage = "My secret message";
$secretCharacter = 'z';
$codedMessage = '';
for($i = 0; $i < strlen($plainTextMessage); $i++) {
    $codedMessage .= $plainTextMessage[$i] ^ $secretCharacter;
}
echo 'Coded Message is: '.$codedMessage.PHP_EOL;
$decodedMessage = '';
for($i = 0; $i < strlen($codedMessage); $i++) {
    $decodedMessage .= $codedMessage[$i] ^ $secretCharacter;
}
echo 'Decoded Message is: '.$decodedMessage.PHP_EOL;

如果在两个字符串之间执行逐位操作,则字符串中的每个字符表示一个8位的八位字节。然后逐字符执行逐位操作。也就是说,首先像ord函数一样将字符转换为整数,然后将结果转换为字符串(与chr相当)。

 echo '1' | 'z';

与相同

 echo chr(ord('1') | ord('z'));

摘自PHP手册:

字符串上的示例#2位XOR操作

<?php
echo 12 ^ 9; // Outputs '5'
echo "12" ^ "9"; // Outputs the Backspace character (ascii 8)
                 // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8
echo "hallo" ^ "hello"; // Outputs the ascii values #0 #4 #0 #0 #0
                        // 'a' ^ 'e' = #4
echo 2 ^ "3"; // Outputs 1
              // 2 ^ ((int)"3") == 1
echo "2" ^ 3; // Outputs 1
              // ((int)"2") ^ 3 == 1
?>

相同的转换逻辑适用于OR |运算符:

<?php
echo 12 | 9; // Outputs '13'
echo "12" | "9"; // Outputs the 9 character (ascii 57)
                 // ('1' (ascii 49)) | ('9' (ascii 57)) = #57
echo "hallo" | "hello"; // Outputs the ascii values #104 #101 #108 #108 #111
                        // 'a' | 'e' = #101
echo 2 | "3"; // Outputs 3
              // 2 | ((int)"3") == 3
echo "2" | 3; // Outputs 3
              // ((int)"2") | 3 == 3
?>

如果在字符串和整数之间执行逐位运算,则字符串将首先转换为整数。

|是一个逐位运算符,它不是对字符串或对象进行操作,而是对位(即0和1)进行操作。在这种情况下,|为OR。也就是说,设置第一或第二自变量中的位。

当您将两者表示为位时,取共同的位,然后将其作为字符串进行回显,在这种情况下,它恰好是"{"。

是的,您可以使用它来编码东西——类似但更好的方法是使用XOR而不是OR。看看http://en.wikipedia.org/wiki/XOR_cipher.

这是位"or"运算符。它返回由至少一个元素('1''z')中设置为1的比特组成的结果。

以下所有结果都相同:

$r1 = '1' | 'z';
$r2 = chr(49) | chr(122); // chr(49) is '1', chr(122) is 'z'
$r3 = chr(49 | 122); // result is chr(123), which is '{'

并且它们都等于CCD_ 9。请在此处查看证明:http://ideone.com/YC048