任何人都可以解释这个PHP代码给我吗?来自单行代码的意外结果
它使用位或操作符
'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;
感谢您的详细解答和示例代码: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手册摘自:
<?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。看看http://en.wikipedia.org/wiki/XOR_cipher。
PHP只是做日常工作。这与表达式相呼应,表达式包含[位运算符](http://www.php.net/manual/en/language.operators.bitwise.php)。结果是可预测的。 – hakre 2012-02-16 11:07:05
为隐藏什么? – 2012-02-16 11:36:53