Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TJvVigenere Fehler / Bedienung wie?? (https://www.delphipraxis.net/108233-tjvvigenere-fehler-bedienung-wie.html)

D-User 9. Feb 2008 12:55


TJvVigenere Fehler / Bedienung wie??
 
Mojn mojn,
bzgl. der Vigenere-Cipher-Komponente in der JVCL bekomme ich Fehler beim
dechiffrieren, hat einer eine Idee?

Code: Button8 auf Form, JvCipher einbinden, und dann bekomme ich 'Fehler!!' angezeigt.
Wie mach ich's richtig, woran liegts?? ( D7 Enterprise mit letztem Update! )

Thnx im Vorhinein!!


Code:
*********************

procedure TForm1.Button8Click(Sender: TObject);
var
i: integer;
VigenereCipher : TJvVigenereCipher;
key,EncodedString, DecodedString: AnsiString;
AsciiStr: AnsiString;
begin
VigenereCipher := TJvVigenereCipher.Create( nil );
key := 'fwe1';
AsciiStr := '';

for i := 133 to 183 do
AsciiStr := AsciiStr + char(i);

EncodedString := VigenereCipher.EncodeString(key,AsciiStr );
DecodedString := VigenereCipher.DecodeString(key,EncodedString );

// Test:
if AsciiStr <> DecodedString then
ShowMessage('Fehler!!');

VigenereCipher.Free;
end;

D-User 10. Feb 2008 10:50

Re: TJvVigenere Fehler / Bedienung wie??
 
Kann mir denn jemand den Fehler bestätigen, oder tritt
der nur bei mir auf?

Kurze Antwort wäre super nett :-D

Die Muhkuh 10. Feb 2008 10:59

Re: TJvVigenere Fehler / Bedienung wie??
 
Hi D-User,

lasst Dir doch mal die beiden Strings ausgeben, anstatt nur die Anzeige "Fehler!!"

Desweiteren wäre es nett, wenn Du Delphi-Code in die [ delphi][ /delphi] Tags (ohne die Leerzeichen) einschließt, dann stellt die Forensoftware das gleich mit Syntax-Highlighting dar.

Und noch was zum Code, Du solltest einen Resourcenschutzblock verwenden:

Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
var
  i: integer;
  VigenereCipher : TJvVigenereCipher;
  key,EncodedString, DecodedString: AnsiString;
  AsciiStr: AnsiString;
begin
  key := 'fwe1';
  AsciiStr := '';

  for i := 133 to 183 do
    AsciiStr := AsciiStr + char(i);

  VigenereCipher := TJvVigenereCipher.Create( nil );
  try
    EncodedString := VigenereCipher.EncodeString(key,AsciiStr );
    DecodedString := VigenereCipher.DecodeString(key,EncodedString );
  finally
    VigenereCipher.Free;
  end;

  // Test:
  if AsciiStr <> DecodedString then
    ShowMessage('Fehler!!');
end;

D-User 10. Feb 2008 11:39

Re: TJvVigenere Fehler / Bedienung wie??
 
Hi Muhkuh,

Dank für die Antwort :wink:

Zitat:

lasst Dir doch mal die beiden Strings ausgeben, anstatt nur die Anzeige "Fehler!!"
schon gemacht, macht aber nicht soviel Sinn, da der decodierte String teilweise ( bei anderen
Ascii-Folgen ) nicht vernünftig, halt nur mit den Balken für nicht-darstellbare Zeichen
angezeigt wird.
Ich hab auch schon einiges reindebugged. Deshalb ja die Frage, weil der Fehler bei mir
etwas eigenartig auftritt:

Die komisch erscheinenden Grenzen ( i := 133 to 183 ) waren grob ausgetestet.
Wenn ich die Grenzen auf 1 bis 255 setze, funktioniert alles korrekt!
Deswegen finde ich das ja so obskur.
Und eh ich jetzt lange anfange wer weiss wo und wie lange herumzudebuggen, wollte ich halt mal
schnell nachfragen ob das Problem bekannt ist oder nur spezifisch für mein System / meine
Konstellation. Auch nach einigem Suchen habe ich nichts finden können.
Wenn das Problem bei jemand anderem nachvollziehbar wäre (ja/nein würde reichen)
gäbe mir das einen Anhaltspunkt in welcher Richtung ich weitersuchen müßte
und würde mir evtl. einige Arbeit sparen. Ohne dass jemand anderes da tatsächlich
viel Arbeit hätte investieren müssen.


Zitat:

Desweiteren wäre es nett, wenn Du Delphi-Code in die [ delphi][ /delphi] Tags (ohne die Leerzeichen) einschließt, dann stellt die Forensoftware das gleich mit Syntax-Highlighting dar.
sorry, war mir noch nicht so bewußt über die Funktionalität, werd ich demnächst natürlich so
machen ;-)


Zitat:

Du solltest einen Resourcenschutzblock verwenden
Hab' ich für den Testfall für unnötig erachtet, im richtigen Prg natürlich korrekt!


Zumindest Dank für die Response, man wird also gelesen ;-)

marabu 10. Feb 2008 12:37

Re: TJvVigenere Fehler / Bedienung wie??
 
Hallo D-User,

wenn man das Pferd hinten aufzäumt, dann stellt man einfach einen Implementierungsfehler in den Basis-Methoden EncodeString() und DecodeString() von JvCipher.TJvCustomCipher fest. Beim Zuweisen eines C-Strings an einen Pascal-String wird beim ersten Auftreten eines Null-Chars das Ende des C-Strings gesehen.

Hier eine Blitz-Kur für die besagten Methoden:

Delphi-Quellcode:
function TJvCustomCipher.DecodeString(const Key, Value: string): string;
var
  Tmp: string;
begin
  Tmp := Value;
  Decode(Key, PChar(Tmp), Length(Value));
  Result := Tmp;
end;

function TJvCustomCipher.EncodeString(const Key, Value: string): string;
var
  Tmp: string;
begin
  Tmp := Value;
  Encode(Key, PChar(Tmp), Length(Value));
  Result := Tmp;
end;
Das Umspeichern ist eigentlich unnötig, aber der Autor der Unit hat sich gegen eine in-place Kodierung entschieden, obwohl er die Basisklasse genau dafür vorgesehen hat. Solange als Übergabekonvention const statt var verwendet wird, muss halt umkopiert werden. Es geht zwar auch ohne,

Delphi-Quellcode:
Encode(Key, PChar(Value), Length(Value));
aber das wäre Programmieren mit Seiteneffekten und zukünftige Compiler-Versionen brechen den Code, wenn sie ihre Semantik für CONST-Parameter ändern.

Grüße vom marabu

D-User 10. Feb 2008 13:08

Re: TJvVigenere Fehler / Bedienung wie??
 
Hi Marabu,

super vielen Dank, scheints tatsächlich gewesen zu sein

Grüße, D-User


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:48 Uhr.

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