Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2016, 14:55   #1
Xchel
Пользователь
 
Регистрация: 24.03.2016
Сообщений: 13
По умолчанию Как изменить программу? Стеганография

задание такое: Есть текст и в нем надо скрыть некоторую фразу, состоящую из букв. Буквы этой фразы представляются как байты. Эти байты надо разбить на биты.
Текст, в котором будет прятаться сообщение, должен иметь много строчек (как стихотворение). Мы должны разбить скрываемый текст на биты. И если очередной бит скрываемой информации равен единице, то В КОНЕЦ ОЧЕРЕДНОЙ СТРОКИ текста-контейнера дописываем пробел. Если же бит равен нулю, то в конец строки не пишем пробел.
После шифрования, шифровку надо будет обратно раскодировать.

А надо сделать: если очередной бит скрываемой информации равен единице, то в тексте-контейнере удваиваем пробел МЕЖДУ СЛОВАМИ В СТРОКЕ. Если очередной бит скрываемого текста равен нулю, то пробел остается одним. Обычные буквы пропускаются в тексте-контейнере.

Код:
const
  fNameIn = 'In.txt';
  fNameOut = 'Out.txt';
var
  fIn, fOut, fh , t: text;
  i, j, cnt : integer;
  OneSymbol : byte;
  sIn, s, sOne : string;
  choice : integer;

begin

  Assign(fIn, fNameIn);
  Assign(fOut, fNameOut);

  repeat
    WriteLn('0-выйти из программы, 1-кодировать сообщение, 2-декодировать.');
    Readln(choice);
  until (choice>=0) and (choice<=2);

  case choice of
    0: WriteLn('Окончание работы по запросу оператора.');
    1: begin
          WriteLn('Выбран режим кодирования');

          assign(fh, 'a.txt');
          reset(fh);
          Readln(fh, sIn);


          Reset(fIn);

          cnt:=0;
          while (cnt<=(Length(sIn)*8)) and (Not EOF(fIn)) do
          begin
            Readln(fIn);
            inc(cnt);
          end;
          Close(fIn);

          if cnt<=(Length(sIn)*8) then begin
            WriteLn('Недосточно строк в исходной файле!');
            WriteLn('Обнаружено ',cnt,' строк, а необходимо не менее ', 1+Length(sIn)*8);
          end
          else begin
            Reset(fIn);
            Rewrite(fOut);
            for i:=1 to Length(sIn) do begin
              OneSymbol := ord(sIn[i]);
              for j:=1 to 8 do begin
                ReadLn(fIn, s);

                while ( Length(s)>0 ) and (s[Length(s)]=' ') do Delete(s,Length(s),1);

                if (OneSymbol and 1) = 1 then s:= s+' ';

                WriteLn(fOut, s);

                OneSymbol := OneSymbol shr 1;

              end;
            end;
            ReadLn(fIn, s);

            while ( Length(s)>0 ) and (s[Length(s)]=' ') do Delete(s,Length(s),1);

            s:= s+'  ';
            WriteLn(fOut, s);

            while Not EOF(FIn) do begin
              ReadLn(fIn, s);
              WriteLn(fOut, s);
            end;

            Close(fOut);
            Close(fIn);

            WriteLn('Процесс кодирования успешно завершён.');

          end;
          end;

    2: begin
        WriteLn('Выбран режим декодирования. Декодируется информация из файла ',fNameOut);
assign(t,’b.txt’);
rewrite(t);
        sIn := '';

        Reset(fOut);
        i:= 0;
        OneSymbol := 0;

        while Not EOF(FOut) do begin
           Readln(fOut, s);
           if Length(s)>=2 then

             if copy(s,Length(s)-1,2)='  '
               then Break;
           inc(i);
           if (Length(s)>0) and (Copy(s, Length(s),1)=' ') then OneSymbol := OneSymbol or $80;
           if i=8 then begin
             sIn := sIn + chr(OneSymbol);
             i:=0;
             OneSymbol := 0;
           end
           else OneSymbol := OneSymbol shr 1;
        end;
        WriteLn(t, sIn); close(t);
        WriteLn;
        WriteLn('Процесс декодирования успешно завершён.');

       end;
       end;

Readln;
end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 08.04.2016 в 15:22.
Xchel вне форума Ответить с цитированием
Старый 08.04.2016, 15:24   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

о, узнаю свой код отсюда

Вы не боитесь, что при сдаче чужого кода Вас спалят?


Цитата:
А надо сделать: если очередной бит скрываемой информации равен единице, то в тексте-контейнере удваиваем пробел МЕЖДУ СЛОВАМИ В СТРОКЕ. Если очередной бит скрываемого текста равен нулю, то пробел остается одним.
При кодировании надо просто найти очередной пробел в строке и удвоить его.
Всё просто. и сделать можно по разному.
Я бы двигался по строке с помощью цикла i:=1; while i<Length(S) do .... и, если встретил пробел, удваивал его.
Да, предварительно все многократные пробелы из строки нужно удалять.


Цитата:
Обычные буквы пропускаются в тексте-контейнере.
Эту фразу я не понял.
Поясните, пожалуйста, что это за "обычные" буквы?
Может быть, тут опечатка? и речь идёт, например, об "одиночных" буквах в тексте-контейнере?


.

Последний раз редактировалось Serge_Bliznykov; 08.04.2016 в 15:31.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2016, 17:42   #3
Xchel
Пользователь
 
Регистрация: 24.03.2016
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
о, узнаю свой код отсюда

Вы не боитесь, что при сдаче чужого кода Вас спалят?



При кодировании надо просто найти очередной пробел в строке и удвоить его.
Всё просто. и сделать можно по разному.
Я бы двигался по строке с помощью цикла i:=1; while i<Length(S) do .... и, если встретил пробел, удваивал его.
Да, предварительно все многократные пробелы из строки нужно удалять.



Эту фразу я не понял.
Поясните, пожалуйста, что это за "обычные" буквы?
Может быть, тут опечатка? и речь идёт, например, об "одиночных" буквах в тексте-контейнере?


.
да, ваш код, не спалят)

а про "обычные буквы"... не знаю, думаю на эту фразу можно не обращать внимания..

а можете кусок кода написать? а то не очень разбираюсь в этом...

Последний раз редактировалось Xchel; 08.04.2016 в 17:45.
Xchel вне форума Ответить с цитированием
Старый 09.04.2016, 19:57   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
а можете кусок кода написать? а то не очень разбираюсь в этом...
могу написать. А какой именно кусок кода Вас интересует?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.04.2016, 20:14   #5
Xchel
Пользователь
 
Регистрация: 24.03.2016
Сообщений: 13
По умолчанию

вот где мы удваиваем пробел между словами в строке
Xchel вне форума Ответить с цитированием
Старый 11.04.2016, 18:49   #6
Xchel
Пользователь
 
Регистрация: 24.03.2016
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
могу написать. А какой именно кусок кода Вас интересует?
...
Xchel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить программу так, чтобы круг двигался не по прямой, а по какому - нибудь другому закону.Например,по какой-нибудь кривой kg250493 C++ Builder 2 24.11.2012 13:44
как изменить программу что бы выводилось количество цифр в каждой строке отдельно? Blackyy Помощь студентам 2 13.10.2012 22:12
Стеганография(как вставить информацию в изображение) SashaGruffs C++ Builder 2 27.09.2011 07:49
как изменить эту программу чтобы она заработала? Анастасия91 Visual C++ 6 13.12.2010 08:05
Как изменить программу? UberStas Помощь студентам 4 13.06.2008 19:02