В PHP вы можете использовать NOT bit operator (~
) для строк, например:
$ php -r "echo ~'šœ—ݶ';"
:^:lk<b=I
Как я могу конвертировать наоборот в пределах допустимого диапазона ASCII (0x80-0xFF)?
Другими словами, как найти инвертированную строку ASCII, которая будет генерировать строку, которую я хочу. При добавлении дополнительных ~
обычно он генерирует символы за пределами диапазона печати.
Например
echo ~'HelloWorld';
??????????
echo ~~'HelloWorld';
HelloWorld
echo ~'lkbI'; // Despite of using the same characters as in the 1st example.
????
Теоретически вы можете просто поместить данные, сгенерированные ~
обратно в код, ~
снова и восстановить исходную строку. На практике это не работает, потому что двоичные данные могут быть искажены промежуточной консолью и/или текстовым редактором, либо с помощью контроля версий или программ FTP. Вы можете сделать двоичные данные безопасными, закодировав их каким-то образом, например, с базой 64:
echo base64_encode(~'HelloWorld');
t5qTk5CokI2Tmw==
echo ~base64_decode('t5qTk5CokI2Tmw==');
HelloWorld
Или вы можете записать необработанные двоичные данные, создавая программный файл PHP:
file_put_contents('x.php', '<?php echo ~\'' . addcslashes(~'HelloWorld', '\\\'') . '\';');
Запуск сгенерированного файла будет корректно выводить "HelloWorld", хотя файл может быть поврежден, если какая-либо программа обрабатывает его как текст.
Похоже, что вы хотите сделать инвертирование низких 7 бит каждого символа, но оставить высокий бит неизменным (поскольку он всегда должен быть равен нулю для ASCII).
Для отдельного байта вы можете сделать это с помощью XORing с помощью 0x7f. Чтобы сделать это во всех байтах в строке, вам нужно создать строку равной длины, чьи байты - все 0x7f. Итак, что-то вроде:
$a = "HelloWorld";
$b = $a ^ str_repeat("\x7f", strlen($a));
должно сработать.