AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Teilstrings abgleichen...

Offene Frage von "g1o2k4"
Ein Thema von g1o2k4 · begonnen am 28. Jan 2007 · letzter Beitrag vom 29. Jan 2007
Antwort Antwort
g1o2k4

Registriert seit: 29. Aug 2006
57 Beiträge
 
#1

Teilstrings abgleichen...

  Alt 28. Jan 2007, 22:29
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Teilstrings abgleichen...

  Alt 29. Jan 2007, 05:37
Ich würde das Problem andersrum Lösen: Nicht die Liste nach dem Suchstring, sondern den Suchstring nach der Liste (Pos()).
Markus Kinzler
  Mit Zitat antworten Zitat
Thorben_K

Registriert seit: 22. Okt 2006
Ort: Darmstadt
105 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Teilstrings abgleichen...

  Alt 29. Jan 2007, 06:32
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
Thorben
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#4

Re: Teilstrings abgleichen...

  Alt 29. Jan 2007, 07:06
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.
  Mit Zitat antworten Zitat
g1o2k4

Registriert seit: 29. Aug 2006
57 Beiträge
 
#5

Re: Teilstrings abgleichen...

  Alt 29. Jan 2007, 13:57
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" ?
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Teilstrings abgleichen...

  Alt 29. Jan 2007, 14:14
t : string;

Und zum .IndexOf: Normalerweise nichts. Allerdings muss w.Strings (omho) eine TStringList sein ...
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
g1o2k4

Registriert seit: 29. Aug 2006
57 Beiträge
 
#7

Re: Teilstrings abgleichen...

  Alt 29. Jan 2007, 14:22
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 ?
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#8

Re: Teilstrings abgleichen...

  Alt 29. Jan 2007, 14:40
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...
Philipp F.
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#9

Re: Teilstrings abgleichen...

  Alt 29. Jan 2007, 14:50
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.
Philipp F.
  Mit Zitat antworten Zitat
g1o2k4

Registriert seit: 29. Aug 2006
57 Beiträge
 
#10

Re: Teilstrings abgleichen...

  Alt 29. Jan 2007, 14:54
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 ?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 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