如何将任何字符串转换为按位反转的ASCII字符串?

时间:2014-11-08 16:21:41

标签: php string bit-manipulation

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

2 个答案:

答案 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));

应该有用。