Стеганография — способ передачи или хранения информации с учётом сохранения в тайне самого факта такой передачи (хранения).
В отличие от криптографии, которая скрывает содержимое тайного сообщения, стеганография скрывает сам факт его существования. Как правило, сообщение будет выглядеть как что-либо иное, например, как изображение, статья, список покупок, письмо или судоку. Стеганографию обычно используют совместно с методами криптографии, таким образом, дополняя её.
Нам был дан файл со скрытым текстом. И было сообщено, что для выделения полезной информации, нужно из каждого кода символа в тексте «выдернуть» младший байт. Это и будет код символа полезной информации.
Однако есть одно «но». Если код символа меньше 128 — это и есть полезная информация.
Разработайте программу, которая из текстового файла выделяет полезную информацию.
Формат ввода
В файле secret.txt хранится текст.
Формат вывода
Выведите спрятанное сообщение.
Примечание
Для манипуляции кодами символов изучите работу функций chr
и ord
.
Пример
Ввод
᥈ᙬᱬᝯ, ᭷ᝯ୲੬!
Вывод
Hello, world!
Решение
В задании несколько “ловушек”.
После решения предыдущих задач, единственная сложность с которой вы можете столкнуться – подзабытые принципы работы с числовыми значениями кодировок символа. Те самые функции chr() и ord(), что упоминаются в примечании.
Открываем файл, читаем, итерируем полученный текст посимвольно, если код символа, полученый с помощью ord() больше 128, то отбрасываем старший байт (в младшем байте помещается 256 значений, значит берем остаток от деления 256) и добавляем его к результату. В противном случае добавляем символ нетронутым. По окончании выводим получившийся текст.
Подробнее про байты и их порядок можно прочитать в Википедии.
Посмотреть код
Решение
file_name = 'secret.txt'
with open(file_name, encoding='UTF-8') as file:
data = file.read()
decoded = ''
for char in data:
code = ord(char)
code = code % 256 if code >= 128 else code
decoded += chr(code)
print(decoded)
деление на 128 тоже работает, вместо 256
Либо у яндекса дырявые тесты, либо я не до конца понял в каком месте деление на 128.
Дело в том, что фактически, нам говорят отфильтровать все, что больше 128, и оторвать от этих чисел старшый байт. А это означает, что получившийся на выходе код должен быть в диапазоне от 0 до 255. 0-128 если это число попадает под условие меньше или равно 128 и 1-255 если было больше чем 128. То есть символ с кодом 0xFFFF (65635) должен превратиться в символ 0xFF (255).
для меня это сложная тема))
https://www.cyberforum.ru/python-tasks/thread3117483.html
вот здесь ещё информацию нашел и способы реализации
Это задание отсылает к теме внутреннего представления данных в памяти компьютера.
Сложно сказать нужно ли сегодня это подавляющему числу программистов в жизни. Мне кажется, что нет. Но иметь об этом представление совершенно точно стоит.
я изучаю тему по youtube во время еды
https://youtu.be/k9wK2FThEsk
может быть вы посоветуете ресурсы??
Не могу. Ютуб как источник информации я воспринимаю плохо, потому что убежден, что прочитать полезнее чем посмотреть. А где и чего почитать я не знаю. Да и посмотреть тоже. В целом в материале, показаном в ролике неплохое объяснение и это действительно может быть полезным для общего развития. Разве что подзатянуто и отнимает много времени. Но это в целом проблема роликов обучающих – на просмотр одного и того же материала по сравнению с чтением, нужно в несколько раз больше времени.
Можно попросить вас, пожалуйста, разделить комментарий.
Тут часть ответа на задание J.
https://reshebnik.mumuproject.com/frontpage/yandex-python-handbook/yandex-python-3-5-potokovyj-vvod-vyvod-rabota-s-tekstovymi-fajlami-json/yandex-handbook-sliyanie-dannyh/#comment-47
очень хотелось бы перенести код и ваши мысли
Не понял сначала что вы имели в виду. Перенес, спасибо за подсказку.