2014-11-08 161 views
0

在PHP中可以使用字符串NOT bit operator~),例如:如何將任何字符串轉換爲按位反轉的ASCII字符串?

$ php -r "echo ~'šœ—ݶ';" 
:^:lk<b=I 

我如何轉換反之亦然接受ASCII範圍(0x80-0xFF)範圍內?

換句話說,如何找到反轉的ASCII字符串,它會產生我想要的字符串。當增加額外的~通常它會產生超出可打印範圍的字符。

E.g.

echo ~'HelloWorld'; 
?????????? 
echo ~~'HelloWorld'; 
HelloWorld 
echo ~'lkbI'; // Despite of using the same characters as in the 1st example. 
???? 
+0

我從第一條命令中得到一個錯誤。你是否錯過了字符串的引號? – Barmar 2014-11-08 16:24:08

+0

@Barmar可能只是通知,請添加'-d error_reporting = 7'來忽略它們或使用引號(我現在已經添加了它們)。 – kenorb 2014-11-08 16:25:00

+0

這不僅僅是一個通知,它是一個「解析錯誤」。 – Barmar 2014-11-08 16:31:32

回答

2

從理論上說,你可以把通過~生成的數據回代碼,~一遍,並恢復原來的字符串。在實踐中,這不能很好地工作,因爲二進制數據可能被中間控制檯和/或文本編輯器,修訂控制或FTP程序所損壞。您可以使二進制數據的安全由以某種方式對其進行編碼,如基地64:

echo base64_encode(~'HelloWorld'); 
t5qTk5CokI2Tmw== 

echo ~base64_decode('t5qTk5CokI2Tmw=='); 
HelloWorld 

或者,你可以通過編程生成PHP文件寫入原始二進制數據:

file_put_contents('x.php', '<?php echo ~\'' . addcslashes(~'HelloWorld', '\\\'') . '\';'); 

運行生成的文件將正確輸出'HelloWorld',儘管如果任何程序將其處理爲文本,該文件可能會被損壞。

2

這聽起來像你想要做的是顛倒每個字符的低7位,但保持高位不變(因爲它應該始終爲ASCII爲零)。

對於單個字節,您可以通過與0x7f異或來實現。要對一個字符串中的所有字節執行此操作,需要創建一個長度相等的字符串,其字節全部爲0x7f。所以像這樣:

$a = "HelloWorld"; 
$b = $a^str_repeat("\x7f", strlen($a)); 

應該工作。