任何人都可以解释这个PHP代码给我吗?来自单行代码的意外结果

问题描述:

有人可以解释什么是PHP在这里做什么以及是否有可能获得可预测的结果?任何人都可以解释这个PHP代码给我吗?来自单行代码的意外结果

这可以用来隐藏消息吗?

echo '1' | 'z'; 
+0

PHP只是做日常工作。这与表达式相呼应,表达式包含[位运算符](http://www.php.net/manual/en/language.operators.bitwise.php)。结果是可预测的。 – hakre 2012-02-16 11:07:05

+0

为隐藏什么? – 2012-02-16 11:36:53

它使用位或操作符

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

或运算两个给

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; 
+0

感谢您的详细解答和示例代码:D – Kirill 2012-02-16 11:43:33

这是按位“或”运算符。它返回在至少一个元素('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 '{' 

和所有的人都等于'{'。见证明这里:http://ideone.com/YC048

如果做两个字符串之间的位运算,在字符串中的每个字符代表8位的八位组。按位操作然后按字符完成字符。那就是先将一个字符转换为一个整数,就像ord函数一样,然后将结果转换为一个字符串(可比较为chr)。

echo '1' | 'z'; 

是作为

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

相同从PHP手册摘自:

Example #2 Bitwise XOR operations on strings

<?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

'|'是'OR'运算符,不是? – 2012-02-16 11:15:35

+0

它是,但XOR示例显示了按位操作中的字符串所发生的情况。这是OP要求的。如果您了解如何将字符用作整数值(并且您了解按位运算如何处理整数),则应该能够理解。 – hakre 2012-02-16 11:19:45

+0

@SalmanA:将示例转换为|并添加了一些解释发生了什么。 – hakre 2012-02-16 11:35:15

|是按位操作员 - 而不是在一个字符串,或对象操作时,它的位操作(即,0和1)。在这种情况下,|是OR。也就是说,设置了第一个或第二个参数中的位。

当同时代表称为比特,采取在共同的位,然后回声它作为一个字符串,它正好是“{”在这种情况下。

是的,你可以用这个编码的东西 - 一个类似的,但更好的方法来做到这一点是使用的替代或XOR。看看http://en.wikipedia.org/wiki/XOR_cipher