在PHP中,您可以使用NOT bit operator(~
)作为字符串,例如:
$ 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 :(得分:2)
理论上,您可以将~
生成的数据再次放回代码~
中,然后恢复原始字符串。在实践中,这不能很好地工作,因为二进制数据可能被中间控制台和/或文本编辑器或修订控制或FTP程序损坏。您可以通过以某种方式对二进制数据进行编码来使其安全,例如base 64:
echo base64_encode(~'HelloWorld');
t5qTk5CokI2Tmw==
echo ~base64_decode('t5qTk5CokI2Tmw==');
HelloWorld
或者您可以通过以编程方式生成PHP文件来编写原始二进制数据:
file_put_contents('x.php', '<?php echo ~\'' . addcslashes(~'HelloWorld', '\\\'') . '\';');
运行生成的文件将正确输出“HelloWorld”,但如果任何程序将其作为文本处理,该文件可能已损坏。
答案 1 :(得分:2)
听起来你想做的是反转每个字符的低7位但保持高位不变(因为对于ASCII,它应该总是为零)。
对于单个字节,可以通过与0x7f进行异或来实现。要对字符串中的所有字节执行此操作,需要创建长度相等的字符串,其字节均为0x7f。如下所示:
$a = "HelloWorld";
$b = $a ^ str_repeat("\x7f", strlen($a));
应该有用。