Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование текста методом замены символов на числа 
V
    Опции темы
Deviant
Дата 7.1.2015, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2015

Репутация: нет
Всего: нет



Всем привет. Нужна помощь в написании программы, которая бы шифровала мой текст методом замены символов на числа. 
Допустим, А=1, Б=35, Г=193. 
У меня есть исходник одной программы(она не моя, спасибо одному человеку). Но там символ заменяется на другой символ. 
Я попытался изменить пару значений во втором массиве на двузначное число, но получил ошибку:  Incompatible types: 'Char' and 'string'. 
Используя этот код, как я могу преобразовать char в string? Или нужно делать всё по-другому? 
Заранее спасибо. 
Вот часть кода:
Код

 const
    mas : array[1..160] of char = ('л','м','н','о','п','р','с','т','у','ф','х','ц',
                                   'M','N','O','P','Q','R','S','T','U','Y','W','X',
                                   '1','2','3','4','5','6','7','8','9','0','v','z',
                                   'ч','ш','щ','ъ','ы','ь','э','ю','я',' ','Д','Е',
                                   'm','n','o','p','q','r','s','t','u','y','w','x',
                                   'a','b','c','d','e','f','g','h','i','j','k','l',
                                   'Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц',
                                   'А','Б','В','Г','Ё','Ж','З','И','Й','К','Ю','Я',
                                   'а','б','в','г','д','е','ё','ж','з','и','й','к',
                                   'A','B','C','D','E','F','G','H','I','J','K','L',
                                   'Ч','Ш','Щ','Ъ','Ы','Ь','Э','V','Z','!','@','"',
                                   '#','№','$',';','%','^',':','&','?','*','(',')',
                                   '-','_','=','+','/','|','\','[',']','{','}','<',
                                   '>','~','`','.');
    massiv:array[1..160] of char= ('.','`','~','>','<','}','{',']','[','\','|','/','+',
                                   '=','_','-',')','(','*','?','&',':','^','%',';','$',
                                   '№','#','"','@','!','Z','V','Э','Ь','Ы','Ъ','Щ','Ш',
                                   'Ч','L','K','J','I','H','G','F','E','D','C','B','A',
                                   'к','й','и','з','ж','ё','е','д','г','в','б','а','Я',
                                   'Ю','К','Й','И','З','Ж','Ё','Г','В','Б','А','Ц','Х',
                                   'Ф','У','Т','С','Р','П','О','Н','М','Л','l','k','j',
                                   'i','h','g','f','e','d','c','b','a','x','w','y','u',
                                   't','s','r','q','p','o','n','m','Е','Д',' ','я','ю',
                                   'э','ь','ы','ъ','щ','ш','ч','z','v','0','9','8','7','6',
                                   '5','4','3','2','1','X','W','Y','U','T','S','R','Q','P',
                                   'O','N','M','ц','ч','ф','у','т','с','р','п','о','н','м','л');

implementation

{$R *.dfm}

procedure TForm1.btnzamenaClick(Sender: TObject);
var
 i,j,a,w:integer;
 text,result:string;
begin
 for w:=0 to 1000 do
 begin
  result:='';
  Text:=redt1.Lines.Strings[w];
   for i:=1 to length(text) do
   for j:=1 to 160 do
   begin
    if text[i] = mas[j] then
     begin
      a:=j;
      text[i]:= massiv[a];
      result:=result+text[i];
      redt1.Lines.Strings[w]:=result;
      break;
     end;
   end;
 end;
end;


Это сообщение отредактировал(а) Deviant - 7.1.2015, 23:13
PM MAIL   Вверх
Poseidon
Дата 8.1.2015, 00:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(Deviant @  7.1.2015,  23:11 Найти цитируемый пост)
 как я могу преобразовать char в string?
Приобразование Char --> string происходит автоматически при присваивании. Твоя ишибка вываливается при попытке приобразовать string --> Char, а это не возможно т.к. Char - это всегда один символ, а string - это заранее не известно сколько символов и зачастую не один.

Делай 2 словаря, один array of Char, а второй array of Byte. Потом пробегайся по всему тексту посимвольно, находи индекс каждого символа в первом массиве и заменяй на число с таким же индексом из второго массива.

Вообще задача очень похожа на задание лабораторной работы.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Deviant
Дата 8.1.2015, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2015

Репутация: нет
Всего: нет



11 лет назад, когда я был в 2 классе, мы писали друг другу записки. Чтобы учителя не знали о чём идёт речь, мы придумали свой "шифр". Тогда мы много чего не знали и в качестве букв мы использовали простые "закарючки"(выдуманные иероглифы). Но потом я предложил эту ерунду сменить на цифры. Вот так вот )
Я начал работать с Delphi, захотел такую программку написать. Но нужной информации не нашёл. Везде описываются "заумные" методы шифрования текста. Метод Цезаря, с каким-то ключом и т.д..
===================================================
Писал-писал, но не получилось. Решил забить. Потом решил напоследок написать и - чудо, получилось. Но как-то криво оно отображается в RichEdit. Что я не так сделал? 
Код

const
   M : array[1..3] of Char = ('А','Б','В');

   B : array[1..3] of Byte = (12,25,33);

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i, a, j, w: integer;
    res, txt: string;
begin
for w:=0 to 1000 do
  begin
 res:='';
 txt:=RichEdit1.Lines.Strings[w];
for i:=1 to length(txt) do
for j:=1 to 3 do
  begin
 if txt[i]=M[j] then
  begin
a:=j;
txt[i]:=chr(B[a]);
res:=res+txt[i];
 RichEdit1.Lines.Strings[w]:=res;
 break;
end;
 end;
  end;
   end;
     end.

Скрин

Это сообщение отредактировал(а) Deviant - 8.1.2015, 05:37
PM MAIL   Вверх
Poseidon
Дата 8.1.2015, 15:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Скрин не открывается, не знаю что у тебя там криво. Вот рабочий пример, разбирайся.

Код

procedure TForm1.Button1Click(Sender: TObject);
const
   M : array[1..3] of Char = ('А', 'Б', 'В');
   B : array[1..3] of Byte = (12, 25, 33);
var
  i, X: Integer;
  Res, Txt: string;
  Exits: Boolean;
begin
  Txt := RichEdit1.Text;
  Res := '';

  for X := 1 to Length(Txt) do
    begin
      Exits := False;
      for i := 1 to High(M) do
        if Txt[X] = M[i] then
          begin
            Res := Res + IntToStr(B[i]);
            Exits := True;
            Break;
          end;

      if not Exits then
        Res := Res + Txt[X];
    end;

  RichEdit1.Text := Res;
end;


А вообще в старших версиях Delphi есть созданный специально для подобного словарь TDictionary. С ним еще проще будет.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Deviant
Дата 8.1.2015, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2015

Репутация: нет
Всего: нет



Да это трабл с радикалом. На него заливал скрин. 
Спасибо! Работает.  Предыдущий вариант тоже был рабочим, но в RichEdit цифры не отображались. Вернее отображались, но то было сложно назвать цифрами.
Сейчас ещё подумаю и сделаю так, чтобы можно было ещё и расшифровывать )
====================================================
Хм. Странно. Я ничего не изменял в твоём коде, лишь добавил пару букв и значений в массивах, но при компиляции выдаёт ошибку: "Unable to create process: Не удаётся найти указанный файл". В чём теперь проблема? Ошибок никаких нет, я ничего не исправлял...
====================================================
Проблема решена. Захотел сделать ещё и расшифровку. Вроде бы сделал, но не расшифровывает. Допустим, А = 1, Б = 2, а Г = 12. Если я напишу "АБ" - оно зашифрует как "12". Но если я попытаюсь расшифровать, то получу "Г".  Как исправить? Неужели невозможно? 

Это сообщение отредактировал(а) Deviant - 8.1.2015, 20:29
PM MAIL   Вверх
ТоляМБА
Дата 8.1.2015, 20:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 1
Всего: 252



Цитата(Deviant @  8.1.2015,  20:05 Найти цитируемый пост)
Incompatible types
Терзают смутные сомнения что ты char с byte сравниваешь.

Цитата(Deviant @  8.1.2015,  20:05 Найти цитируемый пост)
Просто скопировал код для второй кнопки, сменил названия переменных и получил ошибку на строке
Просто скопируй код сюда  smile 
PM   Вверх
Poseidon
Дата 8.1.2015, 20:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(Deviant @  8.1.2015,  18:05 Найти цитируемый пост)
Допустим, А = 1, Б = 2, а Г = 12. Если я напишу "АБ" - оно зашифрует как "12". Но если я попытаюсь расшифровать, то получу "Г".  Как исправить? Неужели невозможно? 
Начать нужно с того, что изначально было "заменить на двузначное число". Т.е. должно быть А = 01, Б = 02, а Г = 12. Но если уж хочется именно так, то нужно использовать какой-нибудь разделитель. Любой нецифровой символ сгодится.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
ТоляМБА
Дата 8.1.2015, 20:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 1
Всего: 252



Цитата(Poseidon @  8.1.2015,  22:40 Найти цитируемый пост)
А = 01, Б = 02
Только тогда тип массива надо stringовый делать, а то тип byte значение 01 в 1, а 02 в 2 преобразует.
Не?
PM   Вверх
Deviant
Дата 8.1.2015, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2015

Репутация: нет
Всего: нет



Хм. Жаль. Тогда придётся использовать разделитель. Допустим, я хочу, чтобы в качестве разделителя использовался символ "|", как мне тогда подправить код? 
Код

const
   M : array[1..3]  of Char = ('А', 'Б', 'Г');

    B : array[1..3] of Byte = (1, 2, 12);
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i, X: Integer;
  Res, Txt: string;
  Exits: Boolean;
begin
  Txt := RichEdit1.Text;
  Res := '';
  for X := 1 to Length(Txt) do
    begin
      Exits := False;
      for i := 1 to High(M) do
        if Txt[X] = M[i] then
          begin
            Res := Res + IntToStr(B[i]);
            Exits := True;
            Break;
          end;
      if not Exits then
        Res := Res + Txt[X];
    end;
  RichEdit2.Text := Res;
end;

procedure TForm1.Button2Click(Sender: TObject);
  var
  k, L: Integer;
  Res, Txt: string;
  Exits: Boolean;
begin
  Txt := RichEdit2.Text;
  Res := '';
  for L := 1 to Length(Txt) do
    begin
      Exits := False;
      for k := 1 to High(B) do
        if Txt[L] = inttoStr(B[k]) then
          begin
            Res := Res + M[k];
            Exits := True;
            Break;
          end;
      if not Exits then
        Res := Res + Txt[L];
    end;
  RichEdit1.Text := Res;
end;

PM MAIL   Вверх
ТоляМБА
Дата 8.1.2015, 22:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 1
Всего: 252



Строка 23 будет выглядеть так:
Код
Res := Res + IntToStr(B[i])+'|';

Строки с 35 по 53 изменятся до неузнаваемости.
PM   Вверх
Poseidon
Дата 8.1.2015, 22:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(ТоляМБА @  8.1.2015,  20:54 Найти цитируемый пост)
а то тип byte значение 01 в 1, а 02 в 2 преобразует.
Не? 
Не. Какая нам разница что будет хранится в массиве-словаре? Главное что бы на выходе получалось с нулем, если цифра меньше 10.

Цитата(ТоляМБА @  8.1.2015,  22:06 Найти цитируемый пост)
Строки с 35 по 53 изменятся до неузнаваемости. 
 smile

Добавлено через 1 минуту и 44 секунды
Цитата(Deviant @  8.1.2015,  21:40 Найти цитируемый пост)
Хм. Жаль. Тогда придётся использовать разделитель.
А как вы в школе шифровали свои записки? Все-равно ведь использовали какой-то разделитель. Скорее всего то был пробел и шифр ваш имел вид "17 3 58 25 48 74 58" и т.п. в таком роде.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Deviant
Дата 8.1.2015, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2015

Репутация: нет
Всего: нет



Ой, а я уже и не помню. Давно было. Вроде бы ставили ' между числами. 
"Строки с 35 по 53 изменятся до неузнаваемости." В каком смысле? Придётся всё переделывать? (
PM MAIL   Вверх
ТоляМБА
Дата 8.1.2015, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 1
Всего: 252



Да вообще-то и не до такой уж неузнаваемости  smile 

Код
const
   M : array[1..3]  of Char = ('А', 'Б', 'Г');
   B : array[1..3] of Byte = (1, 2, 12);

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i, X: Integer;
  Res, Txt: string;
  Exits: Boolean;
begin
  Txt := RichEdit1.Text;
  Res := '';
  for X := 1 to Length(Txt) do
    begin
      Exits := False;
      for i := 1 to High(M) do
        if Txt[X] = M[i] then
          begin
            Res := Res + IntToStr(B[i])+'|';
            Exits := True;
            Break;
          end;
      if not Exits then
        Res := Res + Txt[X]+'|';
    end;
  RichEdit2.Text := Res;
end;

procedure TForm1.Button2Click(Sender: TObject);
  var
  k, L: Integer;
  Res, Txt, MRes: string;
  Exits: Boolean;
begin
  Txt := RichEdit2.Text;
  Res := '';
  MRes := '';
  for L := 1 to Length(Txt) do
    begin
      if Txt[L]<>'|' then
      begin
        MRes := MRes + Txt[L];
        continue;
      end;
      Exits := False;
      for k := 1 to High(B) do
        if MRes = inttoStr(B[k]) then
          begin
            Res := Res + M[k];
            Exits := True;
            Break;
          end;
      if not Exits then
        Res := Res + MRes;
      MRes := '';
    end;
  RichEdit3.Text := Res;
end;


Обрати внимание - я добавил для тестирования еще один компонент - RichEdit3

Добавлено через 9 минут и 12 секунд
Цитата(Poseidon @  9.1.2015,  00:24 Найти цитируемый пост)
Не. Какая нам разница что будет хранится в массиве-словаре?

Но массив-словаря то имеет тип byte !
Цитата(Poseidon @  9.1.2015,  00:24 Найти цитируемый пост)
Главное что бы на выходе получалось с нулем

Выход мы генерируем Res := Res + IntToStr(B[i]);
А если B[1] := 02 то что нам покажет ShowMessage(IntToStr(B[1])) ?
PM   Вверх
Deviant
Дата 8.1.2015, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2015

Репутация: нет
Всего: нет



Отлично! Всё работает как часы! 
Спасибо вам большое, ребят, выручили ) 
Сейчас ещё строчку допишу для кнопки 3, чтобы переводила расшифрованный текст в нижний регистр и всё ) 
Тему можно закрывать, ещё раз спасибо ) 
===================
Дописал ) 
И да, как я понял, то в качестве разделителя нельзя использовать символ '  ? Меня устраивает и "|", но мне просто интересно. 

Это сообщение отредактировал(а) Deviant - 8.1.2015, 23:03
PM MAIL   Вверх
ТоляМБА
Дата 8.1.2015, 23:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 1
Всего: 252



Цитата(Deviant @  9.1.2015,  00:54 Найти цитируемый пост)
 в качестве разделителя нельзя использовать символ ' 

Почему нельзя? Замени в коде '|'  на '''' (четрые одиночных ' )
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1115 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.