Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Optimierung des Quelltextes
CurdledMilk - Di 20.09.05 19:31
Titel: Optimierung des Quelltextes
Hallo ihr!
Ich habe mal ein kleines codierungs-tool geschrieben und wollte euch mal Fragen was ihr davon haltet und vor allem was man rein vom programiertechnischen noch vereinfachen könnte.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| procedure TForm1.Button1Click(Sender: TObject); var schlussel: integer; zeichen, i, l: integer; zeichenu:char; zeichenv,a: string; begin
schlussel:= strtoint(edit1.Text); a:= m1.Text; l:=length(m1.Text); for i:=1 to l do
begin zeichenu:=a[i] ; zeichen:= ORD(zeichenu); zeichenv := chr(Zeichen+schlussel); m2.Text:=m2.Text+zeichenv; end ;
end;
procedure TForm1.Button2Click(Sender: TObject); Entschlüsseln var schlussel: integer; zeichen, i, l: integer; zeichenu:char; zeichenv,a: string; begin
schlussel:= strtoint(edit1.Text); a:= m2.Text; l:=length(m2.Text);
for i:=1 to l do
begin zeichenu:=a[i] ; zeichen:= ORD(zeichenu); zeichenv := chr(Zeichen-schlussel); m1.Text:=m1.Text+zeichenv; end;
end;
end. |
GTA-Place - Di 20.09.05 20:07
Als erstes würde ich mal den Source formatieren,
dann sieht man weiter.
CurdledMilk - Mi 21.09.05 07:57
So hab den Source mal bisl formatiert. Hoffe so ist er besser.
PS: ich bin noch Anfänger
alzaimar - Mi 21.09.05 08:37
Grundsätzlich ist das o.k. (Programmierstil, Variablenbenennung). Ich würde das in eine eigene Unit packen, damit Du es später (für andere Programme) wiederverwenden kannst.
Die Qualität der Verschlüsselung ist aber fast 0%, weil man den Code mit einfachsten Mitteln knacken kann.
Narses - Mi 21.09.05 08:40
Moin!
Mein Vorschlag:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TMainForm = class(TForm) Source: TMemo; Code: TMemo; BtnCodeIt: TButton; BtnDecodeIt: TButton; KeyEdit: TEdit; procedure CheckKey; function Vignere(const S: String): String; procedure Translate(MemoSource, MemoDestination: TMemo); procedure BtnCodeItClick(Sender: TObject); procedure BtnDecodeItClick(Sender: TObject); private public Key: Integer; end;
var MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.CheckKey; begin Key := StrToIntDef(KeyEdit.Text,0) and $FF; KeyEdit.Text := IntToStr(Key); end;
function TMainForm.Vignere(const S: String): String; var i: Integer; begin Result := S; for i := 1 to Length(Result) do Result[i] := Char((Ord(Result[i]) +Key) and $FF); end;
procedure TMainForm.Translate(MemoSource, MemoDestination: TMemo); var i: Integer; begin MemoDestination.Clear; for i := 0 to MemoSource.Lines.Count-1 do MemoDestination.Lines.Add(Vignere(MemoSource.Lines.Strings[i])); end;
procedure TMainForm.BtnCodeItClick(Sender: TObject); begin CheckKey; Translate(Source,Code); end;
procedure TMainForm.BtnDecodeItClick(Sender: TObject); begin CheckKey; Key := -Key; Translate(Code,Source); Key := -Key; end;
end. |
Und das Formular (per "Ansicht als Text" zu übernehmen):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| object MainForm: TMainForm Left = 1148 Top = 124 Width = 424 Height = 183 Caption = 'Vignere-Test' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Position = poDesktopCenter PixelsPerInch = 96 TextHeight = 13 object Source: TMemo Left = 16 Top = 16 Width = 185 Height = 89 Lines.Strings = ( 'Source') TabOrder = 0 end object Code: TMemo Left = 224 Top = 16 Width = 185 Height = 89 Lines.Strings = ( 'Code') TabOrder = 1 end object BtnCodeIt: TButton Left = 16 Top = 120 Width = 75 Height = 25 Caption = 'BtnCodeIt' TabOrder = 2 OnClick = BtnCodeItClick end object BtnDecodeIt: TButton Left = 328 Top = 120 Width = 75 Height = 25 Caption = 'BtnDecodeIt' TabOrder = 3 OnClick = BtnDecodeItClick end object KeyEdit: TEdit Left = 120 Top = 120 Width = 121 Height = 21 TabOrder = 4 Text = '5' end end |
cu
Narses
//EDIT: Schlüssel- und Konvertierungsbereichsprüfung mit
and $FF.
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt
CurdledMilk - Mi 21.09.05 16:02
Hallo!
Vielen dank für die antworten und die Mühen.
@ Narses
Es ist für mich leicht problemmatisch deinen Quelltext nach zu vollziehen, da ich noch ein ziemlicher Anfänger bin ich werde versuchen mich mit der Zeit mal durch zu fitzen.
Könntest du mir einige Sachen erklären?
und zwar:
- and $FF
- StrToIntDef (das def am ende sagt mir nichts)
So das wäre es erst mal vielen Dank noch mal für die Mühe
Narses - Do 22.09.05 00:38
Moin!
CurdledMilk hat folgendes geschrieben: |
Könntest du mir einige Sachen erklären? |
Klar, gerne. :wink:
Damit "beschneidest" du den Wertebereich eines Intergers (+/-2 Milliarden grob) auf 0..255. Basiert darauf, wie der PC einen Integerwert verarbeitet. Das kann man nicht so ganz einfach und schnell erklären, finde ich; mach dich mal über Binärdarstellung von Ganzzahlen und Bitoperationen (sog. "binäres" Und, nicht "logisches") schlau, dann wird dir das auch irgendwann klar.
Ich hätte auch statt dessen "mod 255" schreiben können, nur würde dann eine -257 in eine -2 gewandelt, aber das macht bei dem Vignere-Ansatz auf Zeichenbasis keinen Sinn, deshalb wird mit dem "and $FF" immer in den Bereich 0..255 geschnibbelt (der Zahlenbereich wird quasi umgebrochen). Ach ja, $FF ist die hexadezimale Schreibweise für 255. :wink:
Gib doch mal -1 als Schlüssel ein und verschlüssele was... :D
CurdledMilk hat folgendes geschrieben: |
StrToIntDef (das def am ende sagt mir nichts) |
Stell mal den Cursor auf den Funktionsnamen und drück F1. :wink:
Kurzfassung: Ist das gleiche wie ohne ...Def, aber mit einem
Defaultwert, wenn der String keine gültige Zahl ist (hier nämlich 0).
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!