ďťż

Ładny brzuch

Jak przełożyć ten kod z Delphi na Buildera??

Funkcja szyfruje tekst.

procedure TForm1.BitBtn1Click(Sender: TObject);    var     s: String[255];     c: array[0..255] of Byte absolute s;     i: Integer;     begin         s := 'Tekst do zaszyfrowania';         for i := 1 to Ord(s[0]) do c[i] := 23 xor c[i];         Label1.Caption := s;         s := Label1.Caption;         for i := 1 to Length(s) do s[i] := Char(23 xor Ord(c[i]));         Label2.Caption := s;     end; end.

Wydaje mi się, że poczatek będzie wyglądał tak

void __fastcall TForm1::Button1Click(TObject *Sender) {    String s;/*[255];*/    char c[255];    int i;    s = "Tekst do zaszyfrowania";    for i := 1 to Ord(s[0]) do c[i] := 23 xor c[i];        Label1.Caption := s;        s := Label1.Caption;    for i := 1 to Length(s) do s[i] := Char(23 xor Ord(c[i]));        Label2.Caption := s; }



Tak wygląda moim zdaniem fajniejsza wersja, bo kodująca również xorowaniem, ale hasłem.
AnsiString tekst, haslo; /* cos wpisujemy do tych zmiennych */ for (int i=1;i<tekst.Length();i++)  for (j=1;j<haslo.Length();j++)    tekst[i] = tekst[i] ^ haslo[j]; Label1->Caption = tekst;
A to co podałeś w Builderze wyglądałoby mniej więcej tak:
AnsiString tekst; tekst = "Tekst do zakodowania"; for (int i=1;i<tekst.Length();i++)  tekst[i] = 23 ^ tekst[i]; Label1->Caption = tekst; for (int i=1;i<tekst.Length();i++)  tekst[i] = 23 ^ tekst[i]; Label2->Caption = tekst;
Nie jestem pewien czy dobrze, bo nie piszę ani w jednym, ani w drugim. ;)
Ale jeśli indeks pierwszego znaku w AnsiString to 0 to powinno działać.
Użytkownik Chmurek edytował ten post 23 marzec 2006, 22:53
AnsiString tekst = "Tekst do zakodowania"; char* t = tekst.c_str(); for (int i=0;i<tekst.Length();i++) t[i] = t[i]^23; Label1->Caption = t; for (int i=0;i<tekst.Length();i++) t[i] = t[i]^23; Label2->Caption = t;

A to operator[] w AnsiString nie zwraca char? ;)




A to operator[] w AnsiString nie zwraca char? ;) Twój kod powoduje coś w stylu mojej sygnaturki :P

Jeśli możesz to sprawdź w Helpie BCB jaki jest indeks pierwszego znaku w AnsiString. Bo całkiem możliwe, że w forze powinien zaczynać od 1 zamiast od 0.


Jeśli możesz to sprawdź w Helpie BCB jaki jest indeks pierwszego znaku w AnsiString. Bo całkiem możliwe, że w forze powinien zaczynać od 1 zamiast od 0. Helpa nie mam, ale sprawdziłem - pierwszy znak na indeks 1 :)

W tych liniach wywala totalny błąd w bibliotece rtl60.bpl

W pierwszym listingu

AnsiString tekst, haslo;
    tekst = Edit1->Text;
    haslo = Edit2->Text;

    for (int i=1; i<tekst.Length(); i++){
        for (int j=1; j<haslo.Length(); i++){
            tekst[i] = tekst[i] ^ haslo[j];
        }
    }
    Label1->Caption = tekst;


I w drugim listingu

  tekst[i] = 23 ^ tekst[i];

Tu faktycznie pomogła zmiana indeksowania od 1.

Ale to dalej nie działa :blink:
for (int i=1; i<tekst.Length(); i++){        for (int j=1; j<haslo.Length(); i++){            tekst[i] = tekst[i] ^ haslo[j];        } }
Użytkownik PabloX edytował ten post 23 marzec 2006, 00:23
Ok, dzięki Cyrkiel za informację. Wyedytowałem tamten kod. Co wcale nie oznacza, że będzie działać. ;)
Ale myślę, że będzie.
Chyba że się okaże, że z drugiej strony wykroczy, bo dałem Length()+1, ale to by raczej dziwne było. ;)
Użytkownik Chmurek edytował ten post 23 marzec 2006, 00:11

Tak wygląda moim zdaniem fajniejsza wersja, bo kodująca również xorowaniem, ale hasłem.
AnsiString tekst, haslo; /* cos wpisujemy do tych zmiennych */ for (int i=1;i<tekst.Length()+1;i++)  for (j=1;j<haslo.Length()+1;i++)    tekst[i] = tekst[i] ^ haslo[j]; Label1->Caption = tekst;


Był błąd bo nie było zwiększania zmiennej j .
   for (int i=1; i<tekst.Length(); i++){        for (int j=1; j<haslo.Length(); j++){            tekst[i] = tekst[i] ^ haslo[j];        }    }
Tak już działa
Użytkownik PabloX edytował ten post 23 marzec 2006, 11:50
A faktycznie. Literówka. ;)
W każdym razie co do kodowania to takie zwykłe xorowanie jest raczej kiepskie, bo w efekcie danej literze przyporządkowuje jeden znak.

Chmurek , tak się zastanawiam nad tym kodem z uzyciem hasła.
Wychodzi to trochę bez sensu bo w pętli j mieli ciągle tą sama literę ciągu do zaszyfrowania i w zasadzie wszystkie znaki są zaszyfrowane jednym znakiem z klucza.

Tak mi się wydaje :blink:

Nie jedną. XOR'uje każda literę tekstu przez każdą literę hasła.
Żeby odszyfrować należy zrobić to samo jeszcze raz.

Już jasne.
To jak to się dzieje, że szyfruję tekts "Tekst do zakodowania" kluczem "klucz" odszyfrowując kluczem "klucc" daje poprawny wynik.
Tego już nie rozumiem :blink:

A skopiowałeś kod po poprawce tamtej? To znaczy czy w forze jest "Length()+1"?

Użyłem tego kodu :)
   AnsiString tekst, haslo;    tekst = Edit1->Text;    haslo = Edit2->Text;    for (int i=1; i<tekst.Length(); i++){        for (int j=1; j<haslo.Length(); j++){            tekst[i] = tekst[i] ^ haslo[j];        }    }    Label1->Caption = tekst;    tekst = Label1->Caption;    haslo = Edit3->Text;    for (int i=1; i<tekst.Length(); i++){        for (int j=1; j<haslo.Length(); j++){            tekst[i] = tekst[i] ^ haslo[j];        }    }    Label2->Caption = tekst;
Po uzyciu .Length()+1 algorytm nie działa :huh:
Użytkownik PabloX edytował ten post 23 marzec 2006, 22:40
Aha, dobrze wiedzieć. ;)
Nie mam Buildera tutaj, więc teraz nie sprawdzę dokładnie tego kodu, ale zrobię podobną rzecz na string i zobaczymy co się stanie.
Swoją drogą nie jestem pewien po co robisz coś takiego:
Label1->Caption = tekst; tekst = Label1->Caption;
Użytkownik Chmurek edytował ten post 23 marzec 2006, 22:54
Bo część pierwsza szyfruje, a druga odszyfrowuje - po prostu dwie dałem razem :D
Można je rodzielić i umieścić jako funkcje. :)

Napisałem program robiący to samo z wykorzystaniem string i działa w porządku, więc nie jestem pewien dlaczego u Ciebie jest inaczej.
Kod:
#include <iostream> using namespace std; int main() {  string tekst, haslo, haslo2;  tekst = "Tekst do zakodowania";  haslo = "klucz";  haslo2 = "klucc";  for (int i=0;i<tekst.length();i++)    for (int j=0;j<haslo.length();j++)      tekst[i] = tekst[i] ^ haslo[j];  cout << tekst << endl;  for (int i=0;i<tekst.length();i++)    for (int j=0;j<haslo2.length();j++)      tekst[i] = tekst[i] ^ haslo2[j];  cout << tekst << endl;  return 0; }
Użytkownik Chmurek edytował ten post 23 marzec 2006, 22:54
Daję linka do programu szyfującego Szyfrowania_tekstu_projekt.zip
   AnsiString tekst, haslo;    tekst = Edit1->Text;    haslo = Edit2->Text;    for (int i=1; i<tekst.Length(); i++){        for (int j=1; j<haslo.Length(); j++){            tekst[i] = tekst[i] ^ haslo[j];        }    }    Label1->Caption = tekst;    tekst = Label1->Caption;    haslo = Edit3->Text;    for (int i=1; i<tekst.Length(); i++){        for (int j=1; j<haslo.Length(); j++){            tekst[i] = tekst[i] ^ haslo[j];        }    }    Label2->Caption = tekst;

Upewnijmy się może co dokładnie zwraca Length(). Sprawdź w Helpie albo przetestuj taki kod:
AnsiString tekst = "Tekst"; for (int i=1;i<tekst.Length();i++)  Label1->Caption += tekst[i];
Tak właśnie pomyślałem, że może z jakiegoś powodu długość ciągu znaków zmienia się w trakcie wykonywania pętli, ale to by wtedy ten mój kod też raczej nie działał prawidłowo.
Użytkownik Chmurek edytował ten post 23 marzec 2006, 23:14
Dla szyfrowanego tekstu zwraca: 20,
dla hasła: 5.

Nawet ten kod nie działa prawidłowo
for (int i=1; i<=tekst.Length(); i++){        for (int j=1; j<=haslo.Length(); j++){            tekst[i] = tekst[i] ^ haslo[j];        }    }    Label1->Caption = tekst;    tekst = Label1->Caption;    haslo = Edit3->Text;    for (int i=1; i<=tekst.Length(); i++){        for (int j=1; j<=haslo.Length(); j++){            tekst[i] = tekst[i] ^ haslo[j];        }    }    Label2->Caption = tekst;

Nie jestem pewien po co go po raz trzeci wklejałeś, ale ok. ;)
W każdym razie skoro zwraca ilość znaków w tekście (czyli tak jak sądziłem), a indeks pierwszego znaku w tekście to 1 to zdecydowanie tam powinno być to +1, bo przecież w takim wypadku ostatni znak jest pod indeksem 6.

Wkleiłem by wszyscy wiedzieli o jakim kodzie rozmawiamy.

Wydaje mi się, że
i<tekst.Length()+1 daje to samo co i<=tekst.Length().

Ale wyświetla krzaki :blink:

Ok, naprawię sobie dzisiaj MBR może, żeby mi się Windows uruchamiał to sam sprawdzę.

A ja mam pytanie skąd wziął autor te zadania. Szukałem na stronie organizatora ale narazie nie ma żadnych zadań. Oczywiście chodzi mi o rozwiązania i treści zadań.

Chyba nie ten temat. ;)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •