Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Eigene kleine Verschlüsslung (https://www.delphipraxis.net/169019-eigene-kleine-verschluesslung.html)

Premaider 24. Jun 2012 12:20

Eigene kleine Verschlüsslung
 
Hey Leute ich wollte mir eine eigene, kleine Verschlüsslung von Datein schreiben.
Ich habe bis jetzt das:
Delphi-Quellcode:
for i := 0 to Memo1.Lines.Count -1 do
    begin
      Edit2.text:=Memo1.lines[i];
      j:=length(Edit2.text);
      For h := 1 to j do
        If Edit2.text[h]='A' Then Edit2.text[h]:='B' Else
        If Edit2.text[h]='B' Then Edit2.text[h]:='C' Else
        If Edit2.text[h]='C' Then Edit2.text[h]:='D' Else
        If Edit2.text[h]='D' Then Edit2.text[h]:='E' Else
        If Edit2.text[h]='E' Then Edit2.text[h]:='F' Else
        If Edit2.text[h]='F' Then Edit2.text[h]:='G' Else
        If Edit2.text[h]='G' Then Edit2.text[h]:='H' Else
        If Edit2.text[h]='H' Then Edit2.text[h]:='I' Else
        If Edit2.text[h]='I' Then Edit2.text[h]:='J' Else
        If Edit2.text[h]='J' Then Edit2.text[h]:='K' Else
        If Edit2.text[h]='K' Then Edit2.text[h]:='L' Else
        If Edit2.text[h]='L' Then Edit2.text[h]:='M' Else
        If Edit2.text[h]='M' Then Edit2.text[h]:='N' Else
        If Edit2.text[h]='N' Then Edit2.text[h]:='O' Else
        If Edit2.text[h]='O' Then Edit2.text[h]:='P' Else
        If Edit2.text[h]='P' Then Edit2.text[h]:='Q' Else
        If Edit2.text[h]='Q' Then Edit2.text[h]:='R' Else
        If Edit2.text[h]='R' Then Edit2.text[h]:='S' Else
        If Edit2.text[h]='S' Then Edit2.text[h]:='T' Else
        If Edit2.text[h]='T' Then Edit2.text[h]:='U' Else
        If Edit2.text[h]='U' Then Edit2.text[h]:='V' Else
        If Edit2.text[h]='V' Then Edit2.text[h]:='W' Else
        If Edit2.text[h]='W' Then Edit2.text[h]:='X' Else
        If Edit2.text[h]='X' Then Edit2.text[h]:='Y' Else
        If Edit2.text[h]='Y' Then Edit2.text[h]:='Z' Else
        If Edit2.text[h]='Z' Then Edit2.text[h]:='A' Else
        If Edit2.text[h]='a' Then Edit2.text[h]:='b' Else
        If Edit2.text[h]='b' Then Edit2.text[h]:='c' Else
        If Edit2.text[h]='c' Then Edit2.text[h]:='d' Else
        If Edit2.text[h]='d' Then Edit2.text[h]:='e' Else
        If Edit2.text[h]='e' Then Edit2.text[h]:='f' Else
        If Edit2.text[h]='f' Then Edit2.text[h]:='g' Else
        If Edit2.text[h]='g' Then Edit2.text[h]:='h' Else
        If Edit2.text[h]='h' Then Edit2.text[h]:='i' Else
        If Edit2.text[h]='i' Then Edit2.text[h]:='j' Else
        If Edit2.text[h]='j' Then Edit2.text[h]:='k' Else
        If Edit2.text[h]='k' Then Edit2.text[h]:='l' Else
        If Edit2.text[h]='l' Then Edit2.text[h]:='m' Else
        If Edit2.text[h]='m' Then Edit2.text[h]:='n' Else
        If Edit2.text[h]='n' Then Edit2.text[h]:='o' Else
        If Edit2.text[h]='o' Then Edit2.text[h]:='p' Else
        If Edit2.text[h]='p' Then Edit2.text[h]:='q' Else
        If Edit2.text[h]='q' Then Edit2.text[h]:='r' Else
        If Edit2.text[h]='r' Then Edit2.text[h]:='s' Else
        If Edit2.text[h]='s' Then Edit2.text[h]:='t' Else
        If Edit2.text[h]='t' Then Edit2.text[h]:='u' Else
        If Edit2.text[h]='u' Then Edit2.text[h]:='v' Else
        If Edit2.text[h]='v' Then Edit2.text[h]:='w' Else
        If Edit2.text[h]='w' Then Edit2.text[h]:='x' Else
        If Edit2.text[h]='x' Then Edit2.text[h]:='y' Else
        If Edit2.text[h]='y' Then Edit2.text[h]:='z' Else
        If Edit2.text[h]='z' Then Edit2.text[h]:='a';
Mir sagt Delphi "[Fehler] Unit1.pas(73): Der linken Seite kann nichts zugewiesen werden" aber wieso ?

scrat1979 24. Jun 2012 12:31

AW: Eigene kleine Verschlüsslung
 
Die ganzen IF-Dinger kannst Du Dir sparen, wenn Du dir mal Delphi-Referenz durchsuchenchr() und Delphi-Referenz durchsuchenord() anschaust. Dann brauchst Du Dir nur noch den "Sonderfall Z" vorzunehmen und hier "z" bzw. "Z" durch "a" bzw. "A" ersetzen. Dann hast Du einen übersichtlichen Quellcode und maximal 10 Zeilen zu programmieren :-)

Delphi-Quellcode:
 i    : integer;
 ascii : integer;
 Text1 : String;
 Text2 : String;
 [...]
 Text2 := '':
 for i := 1 to Length(Text1) do
  Text2 := Text2 + Chr(Ord(Text1[i])+1); // Sonderfall "z" nicht berücksichtigt, nur ein Denkanstoß...
 [...]

Daniel 24. Jun 2012 12:32

AW: Eigene kleine Verschlüsslung
 
Von andern Fragen, die mir bei diesem Code in den Sinn kommen, einmal abgesehen:

Was hat Dich motiviert, ein Edit-Feld als Zwischenspeicher zu verwenden? Eine lokale Variable vom Typ "String" wäre vermutlich besser geeignet und würde den von Dir beschriebenen Fehler vermutich gar nicht erst entstehen lassen.

Noch ein Hinweis. Schaue Dir mal die Funktionen "Delphi-Referenz durchsuchenOrd" und "Delphi-Referenz durchsuchenChr" an. Jeder Buchstabe hat auch eine numerische Repräsentation als Zahl. So hat das "A" etwa den Zahlenwert "65". Und das "B" die "66". Mit diesem Wissen könntest Du einiges an Code sparen.

//Edit: Mist, zu langsam. ;-)

Premaider 24. Jun 2012 12:32

AW: Eigene kleine Verschlüsslung
 
Das ist das aber wieder etwas das ich nicht ganz verstehe. Ich möchte es gerne so schaffen

Daniel 24. Jun 2012 12:35

AW: Eigene kleine Verschlüsslung
 
Meinetwegen. :roll:

"Text" ist eine String-Property vom Edit-Feld und auf diese kannst Du nicht per Zeichen-Index schreibend zugreifen. Um eine String-Variable wirst Du nicht umhinkommen, auch wenn es Dir nicht sonderlich gefallen sollte.

Premaider 24. Jun 2012 12:54

AW: Eigene kleine Verschlüsslung
 
Ich hab mir Chr() und Ord() mal angeguckt. Habe es glaube ich schon zu ca. 50% verstanden ;D

Sieht bei mir jetzt so aus
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
i,h,j,k:integer;
Text1: String;
Text2: String;
begin
If Edit1.text<>'Keine Datei ausgewählt' Then DateiKopieren(PChar(OpenDialog1.FileName),GetTempDir + 'Premaider.txt',true);
Memo1.lines.loadfromfile(GetTempDir + 'Premaider.txt');
for i := 0 to Memo1.Lines.Count -1 do
    begin
      Text2:='';
      j:=length(Memo1.lines[i]);
      Text1:=Memo1.lines[i];
      For h := 1 to j do
      If (Text2<>'Z') and (Text2[h]<>'z') Then Text2:=Text2 + Chr(Ord(Text1[i])+1) Else
      If Text2[h]='Z' Then Text2[h]:='A';
      If Text2[h]='z' Then Text2[h]:='a';
end;
end;
aber man bekommt beim Durchführen einen Zugriffsfehler bei "If (Text2<>'Z') and (Text2[h]<>'z') Then Text2:=Text2 + Chr(Ord(Text1[i])+1) Else"

Daniel 24. Jun 2012 13:16

AW: Eigene kleine Verschlüsslung
 
Schaue Dir an, wann Du auf die wievielte Stelle eines Strings zugreifen möchtest und ob der String dann diese Länge auch schon hat. Wenn Dein String z.B. die Zeichenfolge "Hallo" enthält, darfst Du nur auf die Positionen 1 bis 5 zugreifen. Alles andere provoziert den von Dir beobachteten Fehler.

Horst0815 24. Jun 2012 13:16

AW: Eigene kleine Verschlüsslung
 
Fehler

Aphton 24. Jun 2012 13:37

AW: Eigene kleine Verschlüsslung
 
Zitat:

Zitat von Premaider (Beitrag 1172195)
Delphi-Quellcode:
      For h := 1 to j do
      If (Text2<>'Z') and (Text2[h]<>'z') Then Text2:=Text2 + Chr(Ord(Text1[i])+1) Else
      If Text2[h]='Z' Then Text2[h]:='A';
      If Text2[h]='z' Then Text2[h]:='a';

Fehlerhafte Stelle! Hättest du richtig eingerück, wärs dir sofort aufgefallen...

himitsu 24. Jun 2012 13:57

AW: Eigene kleine Verschlüsslung
 
TEdit.Text ist ein Property.
Property kann man entweder nur komplett auslesen oder beschreiben.
(nur Objekte sind indirekt eine Ausnahme, wobei das eigentlich Zeiger sind und auch hier der Zeiger nur koplett befüllt werden kann, aber das referenzierte Objekt natürlich eigenständig ist)

Edit2.Text[h] liest praktisch das Property i eine temporäre Stringvariable aus und [h] graift dann auf ein Zeichen in der Kopie zu.

Lösung: Vorher .Text in eine eigene Stringvariable auslesen/kopieren, dort bearbeiten und dann am Ende komplett zurückschreiben.


Bei
Delphi-Quellcode:
Edit2.Text[h]
geben sogar uralte Delphis eine Fehlermeldung zurück, so wie du es bekommen hast, denn ein Teil-Property ist eben nicht beschreibbar.
Bei Records, als Property gab es lange Zeit ein Problem, wo der Compiler früher keine Fehlermeldung ausgab und den Schreibzugriff auf die Kopie ohne Fehlermeldung zuließ, nur daß diese Änderungen eben nie im Property angekommen sind. (das hat man inzwüschen zum Glück behoben)

PS: viele gleiche IFs = ein CASE
Wobei ja schon angemerkt wurde, daß es hier eine regelmäßige Gesetzmäßigkeit gibt, welche man mathematisch ausnutzen kann.
Aber das die Groß- und Kleinbuchstaben ordinal nicht direkt zusamenhängen, womit man es nicht zusammenhängend berechnen kann.
Ein CASE über die 4 Teilbereichen ("A" bis "Y", "Z", "a" bis "y" und "z") unterteilen und jeweils eine Berechnugn dafür. :zwinker:

Zitat:

Delphi-Quellcode:
If Edit2.text[h]='z' Then Edit2.text[h]:='a';

Sicher daß du ein kleines A meinst? :angle2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz