Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.01.2012, 20:29
Аватар для Amilman
Amilman Amilman вне форума
Новичок
 
Регистрация: 27.03.2011
Адрес: г.Кемерово
Сообщения: 98
Версия Delphi: XE
Репутация: 10
По умолчанию Метод Цезаря с ключём в виде слова

Программа работает исправно с английскими буквами но если ввести в программу что ни будь на русском то ни чего не происходит.
Как это можно исправить?
При ключе hi
Hello - Hflmo
При ключе пр
Привет -Привет

Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls, ActnList, Menus, ClipBrd, Buttons;

type
  TMainForm = class(TForm)
    StatusBar1: TStatusBar;
    ActionList1: TActionList;
    actExit: TAction;
    actLoad: TAction;
    actSave: TAction;
    actRun: TAction;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    GrBoxOutPut: TGroupBox;
    memoOutput: TMemo;
    GrBoxInput: TGroupBox;
    memoInput: TMemo;
    Button1: TButton;
    GroupBox1: TGroupBox;
    edtKey: TLabeledEdit;
    CheckBox1: TCheckBox;
    BitBtn1: TBitBtn;
    Button2: TButton;
    Button3: TButton;
    procedure actExitExecute(Sender: TObject);
    procedure actLoadExecute(Sender: TObject);
    procedure actSaveExecute(Sender: TObject);
    procedure actRunExecute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure actSaveUpdate(Sender: TObject);
    procedure actRunUpdate(Sender: TObject);
    procedure edtKeyKeyPress(Sender: TObject; var Key: Char);
    procedure CheckBox1Click(Sender: TObject);
    procedure memoInputChange(Sender: TObject);
    procedure memoInputKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}


procedure TMainForm.actExitExecute(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.actLoadExecute(Sender: TObject);
begin
  if OpenDialog1.Execute then
    memoInput.Lines.LoadFromFile(OpenDialog1.FileName);
end;

procedure TMainForm.actRunExecute(Sender: TObject);
var i, j, n, fl, pw: integer;
    ch: Char;
    stKey: string;
    flag: Boolean;
begin
  memoOutput.Text := '';
  stKey := edtKey.Text;
  j := 1; fl := 0; pw := 0;
  for i := 1 to Length(memoInput.Text) do
  begin
    ch := memoInput.Text[i];
    flag := false;
    if ch in ['a'..'z'] then
    begin
      flag := true;
      fl := Ord('a'); pw := 26;
    end;
    if ch in ['A'..'Z'] then
    begin
      flag := true;
      fl := Ord('A'); pw := 26;
    end;
    if ch in ['а'..'я'] then
    begin
      flag := true;
      fl := Ord('а'); pw := 33;
    end;
    if ch in ['А'..'Я'] then
    begin
      flag := true;
      fl := Ord('А'); pw := 33;
    end;
    if flag then
    begin
      if CheckBox1.Checked then
        n := (ORD(ch) - fl - ORD(stKey[j])+ 10*pw) mod pw + fl
      else
        n := (ORD(ch) - fl + ORD(stKey[j])) mod pw + fl;
      ch := Chr(n);
      Inc(j);
      if j > Length(stKey) then j := 1;
    end;
    memoOutput.Text := memoOutput.Text + ch;
  end;
end;

procedure TMainForm.actRunUpdate(Sender: TObject);
begin
  actRun.Enabled := ((TRIM(memoInput.Text) <> '') AND (edtKey.Text <> ''));
end;

procedure TMainForm.actSaveExecute(Sender: TObject);
begin
  if SaveDialog1.Execute then
    memoOutput.Lines.SaveToFile(SaveDialog1.FileName);
end;

procedure TMainForm.actSaveUpdate(Sender: TObject);
begin
  actSave.Enabled := memoOutput.Text <>'';
end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
  if SaveDialog1.Execute then
    memoOutput.Lines.SaveToFile(SaveDialog1.FileName);
end;

procedure TMainForm.Button3Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    memoInput.Lines.LoadFromFile(OpenDialog1.FileName);
end;

procedure TMainForm.CheckBox1Click(Sender: TObject);
begin
  if CheckBox1.Checked then
    actRun.Caption := 'Расшифровать'
  else
    actRun.Caption := 'Зашифровать';
end;

procedure TMainForm.edtKeyKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
    actRun.Execute;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  memoInput.Text:='';
  memoOutput.Text:='';
end;


procedure TMainForm.memoInputChange(Sender: TObject);
begin
  StatusBar1.Panels[0].Text := IntToStr(Length(memoInput.Text)) + ' символов';
end;

procedure TMainForm.memoInputKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ((Key = VkKeyScan('a')) or (Key = VkKeyScan('ф'))) and (ssCtrl in Shift) then
    (Sender as TMemo).SelectAll;
end;

end.
Ответить с цитированием
  #2  
Старый 25.01.2012, 20:39
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Символы а..я идут не подряд в кодировке. В середине (около буквы "п" кажется) есть разрыв.
А вообще имхо надо шифровать не только буквы, а всё.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 25.01.2012 в 20:49.
Ответить с цитированием
  #3  
Старый 25.01.2012, 21:09
Аватар для Amilman
Amilman Amilman вне форума
Новичок
 
Регистрация: 27.03.2011
Адрес: г.Кемерово
Сообщения: 98
Версия Delphi: XE
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Символы а..я идут не подряд в кодировке. В середине (около буквы "п" кажется) есть разрыв.
А вообще имхо надо шифровать не только буквы, а всё.

Попробовал так, та же проблема.
Код:
    if ch in ['а'..'п'] then
    begin
      flag := true;
      fl := Ord('а'); pw := 16;
    end;
        if ch in ['р'..'я'] then
    begin
      flag := true;
      fl := Ord('р'); pw := 16;
    end;

Последний раз редактировалось Amilman, 25.01.2012 в 21:16.
Ответить с цитированием
  #4  
Старый 25.01.2012, 21:20
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Еще ord(stKey[j]) будет номером буквы не в алфавите, а в кодировке. И второго вычитания fl нету. Хотя повторюсь - лучше шифровать всё сразу.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 25.01.2012, 21:36
Аватар для Amilman
Amilman Amilman вне форума
Новичок
 
Регистрация: 27.03.2011
Адрес: г.Кемерово
Сообщения: 98
Версия Delphi: XE
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Еще ord(stKey[j]) будет номером буквы не в алфавите, а в кодировке. И второго вычитания fl нету. Хотя повторюсь - лучше шифровать всё сразу.

Можете привести пример? Если не трудно.
Ответить с цитированием
  #6  
Старый 25.01.2012, 21:49
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Пример чего именно?
Если stKey[j] в данный момент равно "а", то ord(stKey[j]) будет равно номеру символа 'а' в кодовой таблице, а не 0, как предполагает шифр.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #7  
Старый 25.01.2012, 22:16
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Bargest
Символы а..я идут не подряд в кодировке. В середине (около буквы "п" кажется) есть разрыв.
С какого это перепугу? Очень даже последовательно идут, только "ё" выпадает из общего списка.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #8  
Старый 25.01.2012, 22:39
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

А, да, попутал. Это в досе было так. Сейчас действительно нормально.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 26.01.2012, 08:21
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от Bargest
Это в досе было так
Вылезай из осдева иногда Настали времена Doom на калькуляторах и компьютеров на плате, которую в карман можно сунуть А ты ещё про кодировки в Досе помнишь...
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025