Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Teilstrings abgleichen... (https://www.delphipraxis.net/85298-teilstrings-abgleichen.html)

g1o2k4 28. Jan 2007 22:29


Teilstrings abgleichen...
 
hallo

folgendes problem:
ich habe ein programm das strings ver und entschlüsselt. beim entschlüsseln (brute force) wird das aktuelle ergebnis der entschlüsslung mit einer wordlist (TStringlist) abgeglichen. diese funktion sieht im moment so aus:

Delphi-Quellcode:
for l := 1 to length(s) do          //string entschlüsseln (i ist der key der getestet wird)
          begin
            s[l] := char(i Xor ord(s[l]));
          end;

          for d := 0 to w.count-1 do //Abgleich mit der Wordlist
          begin
            if s = w.Strings[d] then
            begin
              g := true;
            end;
            if g = true then         //wenn erfolgreich -> break
            begin
              break;
            end;
          end;

das problem ist wenn das entschlüsselte wort (variable: s) zum beispiel "teste" lautet, was nicht in der wordlist vorkommt, war der entschlüsslungsvorgang nicht erfolgreich ! ich möchte aber, dass er dann nachschaut welcher teilstring im wort teste bzw in welchem wort aus der wordlist das entschlüsselte wort drin steckt.
Beispiel: entschlüsseltes wort "teste" -> gibts nicht in der stringlist -> misserfolg -> aber es gibt das wort "test" in der stringlist -> teilstring gefunden "test"

also irgendwie if s = w.Strings[d] then umschreiben für teilstrings. habt ihr ne idee ?

grüße g1o

mkinzler 29. Jan 2007 05:37

Re: Teilstrings abgleichen...
 
Ich würde das Problem andersrum Lösen: Nicht die Liste nach dem Suchstring, sondern den Suchstring nach der Liste (Pos()).

Thorben_K 29. Jan 2007 06:32

Re: Teilstrings abgleichen...
 
Bei deinem Probleme kann ich auch nur Pos sagen aber den Quelltext kann man kürzer schreiben

Delphi-Quellcode:

 for l := 1 to length(s) do          //string entschlüsseln (i ist der key der getestet wird)
          begin
            s[l] := char(i Xor ord(s[l]));
          end;

          for d := 0 to w.count-1 do //Abgleich mit der Wordlist
          begin
            if s = w.Strings[d] then
            begin
              break;
            end;
          end;
Diese Boolean Variable und die 2 If abfrage ist absolut überflüssig

Thorben

Thanatos81 29. Jan 2007 07:06

Re: Teilstrings abgleichen...
 
Man kann die for-Schleife noch los werden, und das andere Problem evtl. wie folgt lösen:

Delphi-Quellcode:
for l := 1 to length(s) do          //string entschlüsseln (i ist der key der getestet wird)
  s[l] := char(i Xor ord(s[l]));
 
if w.Strings.IndexOf(s) > 0 then
begin
  //was halt bei einem Fund gemacht werden soll
end
else
  for i := length(s)-1 downto 1 do
  begin
    t := Copy(s, 1, i);
    if w.Strings.IndexOf(t) > 0 then
    begin
      //was bei einem Teilfund gemacht werden soll
    end;
  end;
Durch das downto erreichen wir, dass die längsten Teilstrings zu erst gefunden werden. Length(s)-1, weil wir nach dem kompletten String ja bereits gesucht haben.

g1o2k4 29. Jan 2007 13:57

Re: Teilstrings abgleichen...
 
Zitat:

Zitat von Thanatos81
Man kann die for-Schleife noch los werden, und das andere Problem evtl. wie folgt lösen:

Delphi-Quellcode:
for l := 1 to length(s) do          //string entschlüsseln (i ist der key der getestet wird)
  s[l] := char(i Xor ord(s[l]));
 
if w.Strings.IndexOf(s) > 0 then
begin
  //was halt bei einem Fund gemacht werden soll
end
else
  for i := length(s)-1 downto 1 do
  begin
    t := Copy(s, 1, i);
    if w.Strings.IndexOf(t) > 0 then
    begin
      //was bei einem Teilfund gemacht werden soll
    end;
  end;

delphi kennt den bezeichner "IndexOf()" nicht muss ich noch irgendwas extra einbinden ? welcher variablen typ ist "t" ?

xZise 29. Jan 2007 14:14

Re: Teilstrings abgleichen...
 
t : string;

Und zum .IndexOf: Normalerweise nichts. Allerdings muss w.Strings (omho) eine TStringList sein ...

g1o2k4 29. Jan 2007 14:22

Re: Teilstrings abgleichen...
 
also ich hab jetzt folgendes:

Delphi-Quellcode:
 if w.IndexOf(s) > 0 then
          begin
            g := true;
          end
          else
            for j := length(s)-1 downto 1 do
            begin
              t := Copy(s, 1, j);
              if w.IndexOf(t) > 0 then
              begin
                h := true;
              end;
            end;
also ohne w.strings.indexof() ist das was anderes ? also es funktioniert. allerdings braucht er pro versucht bei einer wörterliste von 16k worten ca 0,7-1,2 sekunden....gibts auch was effektiveres ?

Flips 29. Jan 2007 14:40

Re: Teilstrings abgleichen...
 
Habs en bisschen kürzen können, aber ob der nun schneller is...
Delphi-Quellcode:
g := (w.IndexOf(s) > 0);
if not g then
  for j := length(s)-1 downto 1 do
     h := (w.IndexOf(Copy(s, 1, j)) > 0);
Ich weiß, die Audits werden mich für meinen Begin-End-Mangel hassen...

Flips 29. Jan 2007 14:50

Re: Teilstrings abgleichen...
 
Hab mal gemessen. Bei ner 8kb Wortlist (gebs zu ist nicht soviel...) benötigt meiner 6% der Zeit des anderen. Hoffe das is allgemeingültig.

g1o2k4 29. Jan 2007 14:54

Re: Teilstrings abgleichen...
 
die rechendauer ist mit zu lang, ich machs umgekehrt:

prüfe ob das wort an stelle "m" der wortliste in t (=dem entschlüsselten wort s) enthalten ist.

Delphi-Quellcode:
if w.IndexOf(s) > 0 then
          begin
            g := true;
          end
          else
          begin
            t := TStringList.create;
            t.Add(s);
            for m := 0 to w.Count - 1 do
            begin
              if t.IndexOf(w[m]) >= 0 then
              begin
                h := true;
              end;
            end;
          end;
aber irgendwie ist da noch ein denkfehler, oder ?
ist t = s ? oder funktioniert dieses prinzip grundsätzlich nicht ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz