Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Delphi] Kodowanie metodą zamiany znaków.

Mivan 13 Maj 2010 01:24 4124 10
  • #1 13 Maj 2010 01:24
    Mivan
    Poziom 9  

    Witam. Chciałbym zrobić automatyczny Replace, żeby zamieniał automatycznie litery na zamienniki. Mogło by to działać w ten sposób:

    RichEdit1.Lines.SaveToFile('aa.txt'); // to co wpiszę w RichEdit1 po kilknięciu w przycisk zapisuje do pliku aa.txt
    << formułka dla ReplaceDialog by podmieniał w aa.txt np. ze stringów 'a' na 'b', 'c' na 'd' etc. >>
    RichEdit2.Lines.LoadFromFile('aa.txt'); // wkleja zmieniony tekst do RichEdit2

    Pomóżcie, pls!

    0 10
  • #2 13 Maj 2010 10:10
    arnoldziq
    Moderator Programowanie

    Mętne to trochę.
    Chcesz używać do tego standardowego ReplaceDialog, czy po prostu chcesz zamieniać w tekście jedne litery na inne w z góry ustalony sposób?
    Z tego co napisałeś, wynika, że nie potrzebujesz żadnych operacji na plikach a jedynie zrobić jakąś formę prostego szyfrowania, przesuwając ASCII znaków o jeden w górę (a->b, b->c, c->d, itd).
    Możesz to spokojnie zrobić wczytując plik do dowolnej kontrolki np. TMemo, pozmieniać tekst i zapisać go tą samą metodą.

    0
  • #3 13 Maj 2010 11:42
    lanky
    Poziom 17  

    Ta procka ci zamieni od razu tekst z Rich1 do Rich2 {z "a" na "b"} itp

    Code:

    var 
    Old,New: string;
    i: integer;
    Ch: Char;
    begin
    Old:= RichEdit1.Text;
    for i:= 1 to Length(Old) do
    begin
      Ch:= old[i];
      inc(Ch);
      new:= new+ Ch;
    end;
    RichEdit2.Text:= new;
    end;

    0
  • #4 13 Maj 2010 15:58
    Mivan
    Poziom 9  

    Sorki, źle się wyraziłem. Nie chcę zmieniać znaków o jeden dalej, tylko na różne inne, tylko chcę uzyskać coś takiego, żeby nie wyświetlało się okienko od Replace i nie pytało jaki znak zamienić na co, tylko żeby po kliknięciu buttona po prostu zamieniło dany znak z np. RichEdit1 i pokazało go w RichEdit2 (Tudzież Memo).

    Jestem początkujacym programistą i po prostu nic innego mi do głowy nie przyszło niż użycie Replace Dialog do podmiany literek. Uczę się programowania wymyślając różne śmieszne programy, ten będzie "szyfrował" literki (podmieniał na inne). Bardziej tu chodzi, żeby zdobyć doświadczenie, dlatego nie robię tego XORem etc.

    A więc z braku doswiadczenia, pomyslalem ze wszystko sie bedzie robic recznie. Napisalem stałe, że 'a' to będzie np. 'd' i myslalem ze bedzie dało radę to "szyfrować" za pomocą podmiany, bo na początku to mi działało na 1 literce "ręcznie"

    if Edit1.Text='b' then Memo1.Lines.Add(b);

    z czego b to był string w stałych.

    0
  • #5 13 Maj 2010 16:31
    arnoldziq
    Moderator Programowanie

    Metoda szyfrowania poprzez zamianę jest bardzo prosta do zrealizowania.
    Tworzysz na formie 3 komponenty :
    1. Edit1 - zawiera literkę którą chcesz zmienić.
    2. Edit2 - zawiera literkę na która chcesz zmienić.
    3. Memo1 - zawiera tekst na którym operujesz.

    Cały tekst można przerobić, właściwie, jedną komendą:

    Code:
    memo1.text:=StringReplace(memo1.text,edit1.text,edit2.text,[rfReplaceAll]);


    Musisz jednak uważać z tego typu transformacjami. Aby móc to potem odkodować trzeba zachować odpowiednią kolejność kodowania i dekodowania, oraz trzeba uważać aby nie następowały po sobie np. takie kombinacje. a->s , s->b. Nie będziesz miał, w takim przypadku, najmniejszej szansy na odkodowanie tekstu z powrotem.

    Jeżeli chcesz się pobawić w proste kodowanie tekstu, to pomyśl nad przeprowadzaniem operacji matematycznych na kodach ASCII poszczególnych znaków w tekście.

    0
  • #6 13 Maj 2010 16:38
    Mivan
    Poziom 9  

    Dzieki wielkie, mam nadzieję, że to ogarnę.

    Mój poprzedni "szyfrer" cyferek kodował, można powiedzieć, matematycznie.

    Składał się z 3 części: długość_liczba zaszyfrowana_koniec(zero)
    i liczba zaszyfrowana była podnoszona do 3 potegi, a długość to była długość liczby. np. 11 = 213310, ale nie umiałem robić odszyfrowywania, więc zmieniłem koncepcję.

    Ok idę próbować, jeszcze raz dzięki.

    0
  • #7 13 Maj 2010 16:55
    arnoldziq
    Moderator Programowanie

    :)
    Rychło w czas (ta zmiana koncepcji).
    Zakodować to można bardzo prosto w ten twój sposób, ale rozkodowanie nie jest możliwe, niestety.
    Zainteresuj się może tą stroną, są tam opisy kilku bardzo prostych metod szyfrowania.
    W sam raz na początek.
    Co prawda w/w strona operuje raczej C++, ale same opisy algorytmów mogą Cię zainteresować.

    0
  • #8 13 Maj 2010 22:41
    Mivan
    Poziom 9  

    Wypas stronka :D Szczególnie mi się podoba szyfrowanie na kwadracie :D Genialne w swojej prostocie :D

    A co do StringReplace, mogę zrobić powiedzmy:
    richedit2.Text:=StringReplace(memo1.Text, baza_literek_a-z , baza_literek_na_które_zostaną_podmienione, [rfReplaceAll]);
    ?
    Tak to by podmieniało od razu wszystkie litery w tekście, a nie tylko jedną?

    0
  • #9 14 Maj 2010 10:15
    arnoldziq
    Moderator Programowanie

    Mivan napisał:
    A co do StringReplace, mogę zrobić powiedzmy:
    richedit2.Text:=StringReplace(memo1.Text, baza_literek_a-z , baza_literek_na_które_zostaną_podmienione, [rfReplaceAll]);
    ?
    Tak to by podmieniało od razu wszystkie litery w tekście, a nie tylko jedną?


    Niestety nie.
    Nie ma tak łatwo. StringReplace może zmienić wszystkie ciągi znaków na inne, wiele razy w tym samym tekście, ale ciąg startowy i wynikowy musi być ustalony.
    Możesz się zainteresować mało znaną funkcją WrapText :
    Code:
    function WrapText ( const SourceString, BreakString  : string; BreakSet  : TSysCharSet; MaxColumnSize  : Integer ) : string;
    Działa ona podobnie jak opisana przez Ciebie, ale podstawia tylko jeden, podany, ciąg znaków w miejsce szukanego.

    Procedurę, która robiłaby to dokładnie w opisany przez Ciebie sposób trzeba napisać samodzielnie.

    0
  • #10 14 Maj 2010 18:28
    Mivan
    Poziom 9  

    Ok, dzieki wielkie :D Pokombinuję, może mi wyjdzie :D

    0
  • #11 30 Lip 2010 12:38
    perszeron
    Poziom 20  

    Code:
    var
    
     Dlugosc, i: Integer;
     Znak: Char;
     zm: String;
      klucz:integer;

    begin
    klucz:=strtoint(edit1.Text);
    zm:= memo1.text;
    Dlugosc :=Length(memo1.text);
    for i :=1 to Dlugosc do
     begin
      znak :=zm[i];
      znak :=Chr(Ord(znak) xor klucz);
      zm[i] :=Znak;
     end;
    memo2.text:=zm;
    end;



    //Koduje i dekoduje txt wedle klucza który wpisujesz w edit1.Text
    Proszę pamiętać o używaniu znaczników code. - arnoldziq

    0
  Szukaj w 5mln produktów