Как преобразовать любую строку в битовую инвертированную строку ASCII?

0

В 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.
????
Теги:
string
bit-manipulation

2 ответа

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).

Для отдельного байта вы можете сделать это с помощью XORing с помощью 0x7f. Чтобы сделать это во всех байтах в строке, вам нужно создать строку равной длины, чьи байты - все 0x7f. Итак, что-то вроде:

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

должно сработать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню