有人能解释一下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