Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Variablentypen bei ord() erzeugen Fehler (https://www.delphipraxis.net/197036-variablentypen-bei-ord-erzeugen-fehler.html)

Nox 12. Jul 2018 19:52

Variablentypen bei ord() erzeugen Fehler
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

ich hab mich seit einiger Zeit mit dem Verschlüsseln und Entschlüsseln von Daten beschäftigt und komme bei der Entschlüsselung einfach mit den Variablentypen nicht weiter.
Warum ist die Variable ein Typ Double und nicht String oder Integer(durch die Zuweisung der Variable)?
Ich poste im Anhang einmal den kompletten Quellcode damit die Funktionsweise verstanden werden kann und einen Screenshot der Fehlermeldung mit Fehlerstelle.
Ich bin noch neu im Bereich Programmierung, es kann sein das es ein ziemlich dummer Fehler ist, jedoch ist die Frage ernst gemeint, da ich nicht weiterkomme.


Fehlerstelle:

Code:
procedure TForm1.Button3Click(Sender: TObject);
var
zurueckZahlInt:Integer;
zurueckZahlStr:String;
zurueck:String;
//Faktor variablen
str1: String;
int1: Integer;
faktorumgewandelt:Integer;
begin
//Faktor umwandeln
str1:= Edit1.Text; //faktor auslesen
int1:= ord(str1[1]); //faktor umwandeln
faktorumgewandelt:=int1;
  //ENTSCHLÜSSELN
//Datei auslesen
//Datei zuweisen
AssignFile(Verschluesselt,'C:\Users\Noah\Desktop\hallo.txt');
//Datei öffnen
ReWrite(Verschluesselt);
//Datei auslesen
ReadLn(Verschluesselt,zurueckZahlStr);                    //hier wird die verschlüsselte Zahl meines Wissens einem Integer zugeordnet
zurueckZahlInt:=StrToInt(zurueckZahlStr);
//verschlüsselter Text zurückführen (durch Faktor)
zurueckZahlInt:=zurueckZahlInt/faktorumgewandelt;                          //hier funktioniert der Typ nicht (plötzlich Double)
zurueck:=Chr(zurueckZahlInt);
end;
Vielen Dank fürs Angucken Noah!

gammatester 12. Jul 2018 20:05

AW: Variablentypen bei ord() erzeugen Fehler
 
Der Operator / erzeugt eine Fließkommazahl. Für Integerdivisionen ohne Rest gibt es div.

ZB: 8/3 = 2.666666666666666667 und 8 div 3 = 2

Selbst wenn kein Rest bleibt liefert / eine Fließkommazahl

ZB: 9/3 = 3.000000000000000 und 9 div 3 = 3

Wenn Du / brauchst und weiter mit Integer rechnen willst, benutze trunc(a/b) oder round(a/b)

Nox 12. Jul 2018 20:17

AW: Variablentypen bei ord() erzeugen Fehler
 
Vielen Dank das macht Sinn und ich benötige ja eh nie eine Kommazahl!
Jetzt hätte ich aber eine andere Frage ... hat jemand eine Ahnung, warum das Program jedes mal crasht beim entschlüsseln? eigentlich sind da doch keine Fehler drinnen oder?
Das Problem geht scheinbar von ReadLn aus....
LG Noah

KodeZwerg 12. Jul 2018 20:26

AW: Variablentypen bei ord() erzeugen Fehler
 
Leg Dir ein Array of Byte an und füttere es mit dem String dann Schreibe das Array in ein File.
So in etwa:
Delphi-Quellcode:
var
  MyRec: Array of Byte;
begin
  for i := 1 to length(InputString) do
    MyRec[i-1] := Ord(InputString[i]);
end;

gammatester 12. Jul 2018 20:27

AW: Variablentypen bei ord() erzeugen Fehler
 
Delphi-Quellcode:
ReWrite(Verschluesselt);
//Datei auslesen
ReadLn(Verschluesselt,zurueckZahlStr);
Mit rewrite legt man eine Datei neu an! Aus Deinem Kommentar entnehme ich, daß Du eigentlich lesen willst. Dafür gibt es 'Reset(Verschluesselt)'.

Nox 12. Jul 2018 21:11

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407072)
Leg Dir ein Array of Byte an und füttere es mit dem String dann Schreibe das Array in ein File.
So in etwa:
Delphi-Quellcode:
var
  MyRec: Array of Byte;
begin
  for i := 1 to length(InputString) do
    MyRec[i-1] := Ord(InputString[i]);
end;

Die Idee ist super aber es hat auch mit der anderen Möglichkeit schonmal ohne crash geklappt nur das bei der Rückverschlüsselung nur noch ein Buchstabe herauskommt.
Dieser ist der Anfangsbuchstabe des verschlüsselten Textinhalts.
Kann es sein das nur ein Buchstabe in Ascii übersetzt wird?

Nox 12. Jul 2018 21:12

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von gammatester (Beitrag 1407073)
Delphi-Quellcode:
ReWrite(Verschluesselt);
//Datei auslesen
ReadLn(Verschluesselt,zurueckZahlStr);
Mit rewrite legt man eine Datei neu an! Aus Deinem Kommentar entnehme ich, daß Du eigentlich lesen willst. Dafür gibt es 'Reset(Verschluesselt)'.

Das hatte ich übersehen vielen Dank!

HAben sie vielleicht eine Idee für mein neustes Problem? tut mir leid aber auch da hab ich schon gefühlt tausend Kombinationen ausprobiert aber es geht einfach nicht (Frage in der anderen Antwort).

LG Noah

KodeZwerg 12. Jul 2018 21:22

AW: Variablentypen bei ord() erzeugen Fehler
 
So wie ich das sehe wird nur ein einziger Char in ein Integer umgewandelt weswegen ich ein Array Vorschlug.
(da der Code keine Formatierung besitzt kann ich auch was überlesen haben, sorry falls das so ist)
So in etwa könnte man das wieder lesbar machen mit der Array Methode von oben.
Delphi-Quellcode:
var
  s: String;
begin
  s := '';
  for i := 0 to Size(MyRec)-1 do
    s := s + Char(MyRec[i]);
end;

gammatester 12. Jul 2018 21:23

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von Nox (Beitrag 1407076)
HAben sie vielleicht eine Idee für mein neustes Problem? tut mir leid aber auch da hab ich schon gefühlt tausend Kombinationen ausprobiert aber es geht einfach nicht (Frage in der anderen Antwort).

Welches neueste Problem? Nur ein Tipp: Der Code ist schwer lesbar, auch deshalb weil (zu mindest mir) nicht klar ist, was eigentlich gemacht werden soll. Da hilft, es ein gute Beschreibung der Aufgabe zu mache, und eventuell etwas was Pseudo-Code.

Nox 12. Jul 2018 21:48

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von gammatester (Beitrag 1407078)
Welches neueste Problem? Nur ein Tipp: Der Code ist schwer lesbar, auch deshalb weil (zu mindest mir) nicht klar ist, was eigentlich gemacht werden soll. Da hilft, es ein gute Beschreibung der Aufgabe zu mache, und eventuell etwas was Pseudo-Code.

Bei der Entschlüsselung wird nur ein Buchstabe angezeigt.
Dieser ist der Anfangsbuchstabe des Textes des vorher verschlüsselten Textdokumentes.
Die Frage ist jetzt eigentlich nur wie ich nicht nur einen sondern alle Buchstaben einlesen ver- und entschlüsseln kann.

Die Formatierung war eigentlich auf eine viel kleineres Projekt ausgelegt tut mir sehr leid ich versuche das zu verbessern!

Es soll eine Textdatei ausgewählt werden können.
Diese wird danach eingelesen und als String in das Projekt importiert.
Nun soll mit hilfe der Funktion ord() zu jedem Buchstaben der Ascii Code (ich glaube das ist Ascii) in eine Variable geschrieben werden.
Um Die Verschlüsselung zu erreichen soll eine einzugebene Zahl als Multiplikator dienen um jegliche Ascii Zahlen (umgewandelte Buchstaben) zu "verschlüsseln".
das Ergebnis dieser Multiplikation soll im gleichen Textdokument gespeichert werden und den Originaltext ersetzen.

Beim Entschlüsseln soll durch eingabe des zuvor frei gewählten Faktors die "Verschlüsselung", also die Multiplikation, rückgängig gemacht werden und die Original Ascii Zahlen wiederhergestellt werden.
Durch Chr() sollen die umgewandelten buchstaben nun wiederherstellbar sein und im selben Textdokument, die verschlüsselten Zahlen ersetzend, gespeichert werden.

Ich hoffe das Funktionsprinzip ist nun eher verständlich!

LG Noah

Nox 12. Jul 2018 21:52

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407077)
So wie ich das sehe wird nur ein einziger Char in ein Integer umgewandelt weswegen ich ein Array Vorschlug.
(da der Code keine Formatierung besitzt kann ich auch was überlesen haben, sorry falls das so ist)
So in etwa könnte man das wieder lesbar machen mit der Array Methode von oben.
Delphi-Quellcode:
var
  s: String;
begin
  s := '';
  for i := 0 to Size(MyRec)-1 do
    s := s + Char(MyRec[i]);
end;

Ich muss zugeben das ich aufgrund mangelnder Erfahrung keinen Array einbauen kann.
Ich verstehe soweit das man in einen Array verschiedene Werte speichern kann und die Größe dynamisch festlegbar ist.
ich hoffe ich habe das soweit richtig verstanden.
Es tut mir sehr leid wenn das nervig für Sie ist und ich würde es auch nicht schlimm finden wenn Sie mir bei weiteren Hilfestellungen nicht mehr alles erklären möchten.

Trotzdem ein großes danke und ich werde versuchen ihren Code zu verstehen und irgendwie umzusetzen!

LG Noah

gammatester 12. Jul 2018 22:08

AW: Variablentypen bei ord() erzeugen Fehler
 
Ja das ist besser verständlich. Da bieten sich Strings an, jeweils einer für's Original und die verschlüsselte Ausgabe. Ein einfaches Beispiel:
Delphi-Quellcode:
var
  s,t: string;
  i: integer;
  c1,c2: char;
begin
  readln(s);
  t := '';
  for i:=1 to length(s) do begin
    c1 := s[i];
    //berechne c2 aus c1
    //Beispiel:
    //die nächste Zeile invertiert das unterste Bit des Zeichens
    c2 := char(ord(c1) xor 1);
    t := t + c2;
  end;
  writeln(t);
end.
Wenn man 'Test' eingibt, ist die Ausgabe 'Udru'.

Das ganze dann in eine Schleife einbauen, Lesen und Schreiben in Datei.

Achtung, beim Verschlüsseln können Zeichen generiert werden, die nicht lesbar sind oder Pascal-Readln durcheinander bringen (zB wenn ein Zeilenende generiert wird).

Nox 12. Jul 2018 22:25

AW: Variablentypen bei ord() erzeugen Fehler
 
Delphi-Quellcode:
var
  s,t: string;
  i: integer;
  c1,c2: char;
begin
  readln(s);  //s ist also das Textdokument in Form eines Strings?
  t := '';
  for i:=1 to length(s) do begin
    c1 := s[i];  // s[1] steht dabei für welche Operations? (bin nur Anfänger)
    //berechne c2 aus c1    //Ist c1 dabei der unverschlüsselte Buchstabe und c2 der verschlüsselte?
    //Beispiel:
    //die nächste Zeile invertiert das unterste Bit des Zeichens
    c2 := char(ord(c1) xor 1);  //wofür ist dieser Schritt? ist das eine anderer Vorschlag für eine "Verschlüsselung"? 
    t := t + c2;    //ist t der String der im Ausgabedokument abgespeichert werden soll?
  end;
end.
Tut mir leid wenn das nervt...

LG Noah

gammatester 12. Jul 2018 22:39

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

c1 := s[i]; // s[1] steht dabei für welche Operations? (bin nur Anfänger)
Das ist s[i] nicht s[1], das i-Zeichen im Eingabestring
Zitat:

//berechne c2 aus c1 //Ist c1 dabei der unverschlüsselte Buchstabe und c2 der verschlüsselte?
Ja, da setzt Du dann Deine spezielle Verschlüsselung ein.
Zitat:

t := t + c2; //ist t der String der im Ausgabedokument abgespeichert werden soll?
Ja, man start mit einem leeren String und hängt jeweil das gerade verschlüsselte Zeichen an.

Zitat:

Um Die Verschlüsselung zu erreichen soll eine einzugebene Zahl als Multiplikator dienen um jegliche Ascii Zahlen (umgewandelte Buchstaben) zu "verschlüsseln".
das Ergebnis dieser Multiplikation soll im gleichen Textdokument gespeichert werden und den Originaltext ersetzen.
Das ist nicht so einfach, weil

1) eine Textdatei nicht gleichzeitig gelesen und geschrieben werden kann

2) nicht jeder Faktor geignet ist (für 8-Bit-Zeichen muss der Faktor teilfremd zu 256 sein).

KodeZwerg 12. Jul 2018 22:44

AW: Variablentypen bei ord() erzeugen Fehler
 
Delphi-Quellcode:
procedure DateiDingens(const InputString: string; const Modifier: Byte; var Output: String);
var
  s: string;
  i: Integer;
  b: Byte;
  f: file of Byte;
begin
  // Datei mit verschluesseltem Inhalt sichern
  AssignFile(F, Application.ExeName+'.txt');
  Rewrite(f);
  for i := 1 to Length(InputString) do
  begin
    b := Ord(InputString[i]) + Modifier;
    write(f, b);
  end;
  CloseFile(F);

  // Datei mit verschluesseltem Inhalt laden
  AssignFile(F, Application.ExeName+'.txt');
  Reset(F);
  s := '';
  while not Eof(F) do
  begin
    Read(f, b);
    s := s + Char(b - Modifier);
  end;
  CloseFile(F);
  Output := S;
end;
Das sollte das machen was Du möchtest, Dateinamen ersetzen und ab gehts :-D
Ps: Das ist ein all-in-one Beispiel damit Du gleich siehst wie man speichert und lädt.
Pps: InputString sollte Text sein, bei Binär läuft das mit dem Modifier schnell über 255 hinaus und alles ist futsch.

p80286 12. Jul 2018 22:45

AW: Variablentypen bei ord() erzeugen Fehler
 
kribbelige Finger

p80286 12. Jul 2018 22:48

AW: Variablentypen bei ord() erzeugen Fehler
 
Beim Ver- und Entschlüsseln würde ich maximalen Abstand von Strings nehmen, binär wäre besser aber sei's drum

Delphi-Quellcode:
var
  Infile : Textfile;
   s,t: string;
   i: integer;
   c1,c2: char;
begin
   assignfile(infile,'c:\irgendwo\Meinzuverschluesselnder.txt');
   reset(infile);
   assignfile(outfile,'c:\rgendwoanders\verschluesselter.txt');
   rewrite(outfile);
   //------------------------
   // Hier sollte nun eine Repeat until oder
   // while - Schleife beginnen
   //----------------
   readln(infile,s); //s ist der erste String einer Textdatei
   t := '';
   for i:=1 to length(s) do begin
     c1 := s[i]; // s[1] ist der ite Buchstabe des Strings
     //berechne c2 aus c1 //Ist c1 dabei der unverschlüsselte Buchstabe und c2 der verschlüsselte?
     //Beispiel:
     //die nächste Zeile invertiert das unterste Bit des Zeichens
     c2 := char(ord(c1) xor 1); //Eine Art Versclüsselung
     t := t + c2; //ist t der String der im Ausgabedokument abgespeichert werden soll? - Ja
   end;
   writeln(Outfile,t);
   //--------
   closefile(outfile);
   closefile(Infile);
end;
Gruß
K-H

Nox 12. Jul 2018 22:50

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von gammatester (Beitrag 1407086)
Zitat:

c1 := s[i]; // s[1] steht dabei für welche Operations? (bin nur Anfänger)
Das ist s[i] nicht s[1], das i-Zeichen im Eingabestring
Zitat:

//berechne c2 aus c1 //Ist c1 dabei der unverschlüsselte Buchstabe und c2 der verschlüsselte?
Ja, da setzt Du dann Deine spezielle Verschlüsselung ein.
Zitat:

t := t + c2; //ist t der String der im Ausgabedokument abgespeichert werden soll?
Ja, man start mit einem leeren String und hängt jeweil das gerade verschlüsselte Zeichen an.

Zitat:

Um Die Verschlüsselung zu erreichen soll eine einzugebene Zahl als Multiplikator dienen um jegliche Ascii Zahlen (umgewandelte Buchstaben) zu "verschlüsseln".
das Ergebnis dieser Multiplikation soll im gleichen Textdokument gespeichert werden und den Originaltext ersetzen.
Das ist nicht so einfach, weil

1) eine Textdatei nicht gleichzeitig gelesen und geschrieben werden kann

2) nicht jeder Faktor geignet ist (für 8-Bit-Zeichen muss der Faktor teilfremd zu 256 sein).


Der 1. Punkt macht auf jeden Fall Sinn Super!
Bei dem 2. versteh ich es jedoch nicht ganz...ist es nicht egal welche Zahlen benutzt werden da die Verschlüsselung ja mit der Multiplikation und erst die Entschlüsselung mit der Division des bereits benutzten Multiplikators abläuft?

Nox 12. Jul 2018 22:52

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von p80286 (Beitrag 1407089)
Beim Ver- und Entschlüsseln würde ich maximalen Abstand von Strings nehmen, binär wäre besser aber sei's drum

Delphi-Quellcode:
var
  Infile : Textfile;
   s,t: string;
   i: integer;
   c1,c2: char;
begin
   assignfile(infile,'c:\irgendwo\Meinzuverschluesselnder.txt');
   reset(infile);
   assignfile(outfile,'c:\rgendwoanders\verschluesselter.txt');
   rewrite(outfile);
   //------------------------
   // Hier sollte nun eine Repeat until oder
   // while - Schleife beginnen
   //----------------
   readln(infile,s); //s ist der erste String einer Textdatei
   t := '';
   for i:=1 to length(s) do begin
     c1 := s[i]; // s[1] ist der ite Buchstabe des Strings
     //berechne c2 aus c1 //Ist c1 dabei der unverschlüsselte Buchstabe und c2 der verschlüsselte?
     //Beispiel:
     //die nächste Zeile invertiert das unterste Bit des Zeichens
     c2 := char(ord(c1) xor 1); //Eine Art Versclüsselung
     t := t + c2; //ist t der String der im Ausgabedokument abgespeichert werden soll? - Ja
   end;
   writeln(Outfile,t);
   //--------
   closefile(outfile);
   closefile(Infile);
end;
Gruß
K-H

Das sieht ziemlich übersichtlich und auf jeden Fall leichter verständlich aus!... ich versuche alles zu verstehen und einzubauen Dankeschön!
Sollte es noch ein Problemchen geben schreibe ich wieder :)

LG Noah

KodeZwerg 12. Jul 2018 22:58

AW: Variablentypen bei ord() erzeugen Fehler
 
Bin damit raus, viel Glück.

Nox 12. Jul 2018 22:58

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407093)
Bin damit raus, viel Glück.

Dankeschön für die große Hilfe!!

Nox 12. Jul 2018 23:00

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von p80286 (Beitrag 1407089)
Beim Ver- und Entschlüsseln würde ich maximalen Abstand von Strings nehmen, binär wäre besser aber sei's drum

Delphi-Quellcode:
var
  Infile : Textfile;
   s,t: string;
   i: integer;
   c1,c2: char;
begin
   assignfile(infile,'c:\irgendwo\Meinzuverschluesselnder.txt');
   reset(infile);
   assignfile(outfile,'c:\rgendwoanders\verschluesselter.txt');
   rewrite(outfile);
   //------------------------
   // Hier sollte nun eine Repeat until oder
   // while - Schleife beginnen
   //----------------
   readln(infile,s); //s ist der erste String einer Textdatei
   t := '';
   for i:=1 to length(s) do begin
     c1 := s[i]; // s[1] ist der ite Buchstabe des Strings
     //berechne c2 aus c1 //Ist c1 dabei der unverschlüsselte Buchstabe und c2 der verschlüsselte?
     //Beispiel:
     //die nächste Zeile invertiert das unterste Bit des Zeichens
     c2 := char(ord(c1) xor 1); //Eine Art Versclüsselung
     t := t + c2; //ist t der String der im Ausgabedokument abgespeichert werden soll? - Ja
   end;
   writeln(Outfile,t);
   //--------
   closefile(outfile);
   closefile(Infile);
end;
Gruß
K-H


Ein maximaler Abstand von Strings?

LG Noah

gammatester 12. Jul 2018 23:04

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von Nox (Beitrag 1407090)
Bei dem 2. versteh ich es jedoch nicht ganz...ist es nicht egal welche Zahlen benutzt werden da die Verschlüsselung ja mit der Multiplikation und erst die Entschlüsselung mit der Division des bereits benutzten Multiplikators abläuft?

Nein, aus zwei Gründen. Die (Ansi-)Zeichen haben 8-Bit, ord also liefert Werte 0..255, wenn Du die multipliziert erhält man im allgemeinen Werte > 255, die damit nicht in ein Zeichen passen. Deshalb könnte der Verschlüsselungsteil sein

c2 := char( faktor*ord(c1) mod 256)

als nur die untersten 8 Bit des Produkts.

Zweitens: Wenn Du zB faktor=16 hast, gibt es ein Problem

16 -> 0
32 -> 0

etc. Das heißt, eine Entschlüsselung ist nicht möglich. Aber zB factor=13 ist, entschlüsselt wird dann mit dem Faktor 197. (Das ist modulare Mathematik, muss man nicht unbedingt wissen).

Und nochmal: Dies ist nur eine Einführung und gefährlich, weil nicht darstellbar Zeichen entstehen können. Wie schon von p80286 gesagt: binär wäre besser, d.h. Dein Ausgabe wäre ein file of byte.

Aber bau erstmal die Sache mit char/string.

Gute Nacht.

Nox 12. Jul 2018 23:09

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von gammatester (Beitrag 1407096)
Zitat:

Zitat von Nox (Beitrag 1407090)
Bei dem 2. versteh ich es jedoch nicht ganz...ist es nicht egal welche Zahlen benutzt werden da die Verschlüsselung ja mit der Multiplikation und erst die Entschlüsselung mit der Division des bereits benutzten Multiplikators abläuft?

Nein, aus zwei Gründen. Die (Ansi-)Zeichen haben 8-Bit, ord also liefert Werte 0..255, wenn Di die multipliziert erhält man im allgemeinen Werte > 255, die damit nicht in ein Zeichen passen. Deshalb könnte der Verschlüsselungsteil sein

c2 := char( faktor*ord(c1) mod 256)

als nur die untersten 8 Bit des Produkts.

Zweitens: Wenn Du zB faktor=16 hast, gibt es ein Problem

16 -> 0
32 -> 0

etc. Das heißt, eine Entschlüsselung ist nicht möglich. Aber zB factor=13 ist, entschlüsselt wird dann mit dem Faktor 197. (Das ist modulare Mathematik, muss man nicht unbedingt wissen).


Das sieht sehr logisch aus jedoch hab ich davon mit 16 Jahren leider keine Ahnung Tut mir leid!
Ich versuche jetzt erstmal mit allen Hilfen das Programm zusammenzubasteln!

LG Noah

KodeZwerg 12. Jul 2018 23:14

AW: Variablentypen bei ord() erzeugen Fehler
 
Rein Interessehalber, funktioniert mein Beispiel-Code bei Dir nicht oder ist es die falsche Art der "verschluesselung" die ich anwende, weil das Beispiel funktioniert von vorne bis hinten solange es Text ist um den es sich handelt.
(Post #15 meine ich)

Nox 12. Jul 2018 23:19

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407100)
Rein Interessehalber, funktioniert mein Beispiel-Code bei Dir nicht oder ist es die falsche Art der "verschluesselung" die ich anwende, weil das Beispiel funktioniert von vorne bis hinten solange es Text ist um den es sich handelt.

Tatsächlich war ich bis eben noch am aufräumen im Code jedoch hab ich jetzt meines Wissens die Funktionen so eingearbeitet, dass es funktionieren sollte, jedoch erscheint nur ein leeres Dokument nach dem Ausführen...ich denke aber das liegt eher an mir

Die beiden verwendeten Prozeduren:
Delphi-Quellcode:
//String aus einer Datei laden Funktion
function LoadStringFromFile(sInFile: String; var sFileString: String): Boolean;
var
  FileStream: TFileStream;
begin
  Result := False;
  if not FileExists(sInFile) then Exit;
  FileStream := TFileStream.Create(sInFile, fmOpenRead);
  try
    if FileStream.Size <> 0 then begin
      SetLength(sFileString, FileStream.Size);
      FileStream.Read(sFileString[1], FileStream.Size);
      Result := True;
    end;
  finally FileStream.Free end;
end;
//Funktion Ende
//Funktion Verschlüsselung
procedure Verschluesselung(const InputString: string; const Modifier: Byte; var Output: String);
var
  s: string;
  i: Integer;
  b: Byte;
  f: file of Byte;
begin
  // Datei mit verschluesseltem Inhalt sichern
  AssignFile(F, 'C:\Users\Noah\Desktop\hallo.txt');
  Rewrite(f);
  for i := 1 to Length(InputString) do
  begin
    b := Ord(InputString[i]) + Modifier;
    write(f, b);
  end;
  CloseFile(F);

  // Datei mit verschluesseltem Inhalt laden
  AssignFile(F, 'C:\Users\Noah\Desktop\hallo.txt');
  Reset(F);
  s := '';
  while not Eof(F) do
  begin
    Read(f, b);
    s := s + Char(b - Modifier);
  end;
  CloseFile(F);
  Output := S;
end;
//Funktion Ende
Der Button:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  dateistring,output:String;

begin
   //String laden (Dateipfad der umzuwandelnden Datei,Ziel String)
    LoadStringFromFile(filename,dateistring);
   //Verschlüsselung laden
    verschluesselung(dateistring,StrToInt(Edit1.text),output);
      showmessage(output);





end;
LG Noah

p80286 12. Jul 2018 23:24

AW: Variablentypen bei ord() erzeugen Fehler
 
Nochmal in aller Deutlichkeit
Du verschlüsselst Daten, keine Zeichen! Wenn Du mit Char oder Strings und Texfiles hantierst kannst Du Dir jede Menge ungewollte Fehler einhandeln.
Das mag ein- zweimal gut gehen aber auf Dauer geht das schief.

Gruß
K-H

Nox 12. Jul 2018 23:29

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von p80286 (Beitrag 1407102)
Nochmal in aller Deutlichkeit
Du verschlüsselst Daten, keine Zeichen! Wenn Du mit Char oder Strings und Texfiles hantierst kannst Du Dir jede Menge ungewollte Fehler einhandeln.
Das mag ein- zweimal gut gehen aber auf Dauer geht das schief.

Gruß
K-H

Soll ich jetzt alles ins Binärsystem umwandeln?
Wenn ja wie? Tut mir leid aber ich zwinge auch niemandem mir zu helfen.

LG Noah

KodeZwerg 12. Jul 2018 23:38

AW: Variablentypen bei ord() erzeugen Fehler
 
Hier meine Variante entheddert so das Du theoretisch damit gleich loslegen kannst, wenn niemand einwände hat.
Nur für Text, wohlgemerkt(!)
Delphi-Quellcode:
procedure CryptStringToFile(const InputString: string; const Modifier: Byte; const Filename: String);
var
  s: string;
  i: Integer;
  b: Byte;
  f: file of Byte;
begin
  AssignFile(F, Filename);
  Rewrite(f);
  for i := 1 to Length(InputString) do
  begin
    b := Ord(InputString[i]) + Modifier;
    write(f, b);
  end;
  CloseFile(F);
end;

function CryptFileToString(const Filename: string; const Modifier: Byte): String;
var
  b: Byte;
  f: file of Byte;
begin
  AssignFile(F, Filename);
  Reset(F);
  Result := '';
  while not Eof(F) do
  begin
    Read(f, b);
    Result := Result + Char(b - Modifier);
  end;
  CloseFile(F);
end;
So hier Aufrufen:
Delphi-Quellcode:
var
  s : String;
begin
  s := 'Das ist ein DP Test.';
  // in dieser Zeile speichern wir einen String S verschluesselt in eine Datei
  CryptStringToFile(S, 5, Application.ExeName+'.txt');

  s := ''; // <- hier wird String gekillt, wir wollen ja nicht cheaten :-)
  // in dieser Zeile holen wir den verschluesselten String zurück
  s := CryptFileToString(Application.ExeName+'.txt', 5);

  // mach was mit "s"
end;

Nox 12. Jul 2018 23:49

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407104)
Hier meine Variante entheddert so das Du theoretisch damit gleich loslegen kannst, wenn niemand einwände hat.
Nur für Text, wohlgemerkt(!)
Delphi-Quellcode:
procedure CryptStringToFile(const InputString: string; const Modifier: Byte; const Filename: String);
var
  s: string;
  i: Integer;
  b: Byte;
  f: file of Byte;
begin
  AssignFile(F, Filename);
  Rewrite(f);
  for i := 1 to Length(InputString) do
  begin
    b := Ord(InputString[i]) + Modifier;
    write(f, b);
  end;
  CloseFile(F);
end;

function CryptFileToString(const Filename: string; const Modifier: Byte): String;
var
  b: Byte;
  f: file of Byte;
begin
  AssignFile(F, Filename);
  Reset(F);
  Result := '';
  while not Eof(F) do
  begin
    Read(f, b);
    Result := Result + Char(b - Modifier);
  end;
  CloseFile(F);
end;
So hier Aufrufen:
Delphi-Quellcode:
var
  s : String;
begin
  s := 'Das ist ein DP Test.';
  // in dieser Zeile speichern wir einen String S verschluesselt in eine Datei
  CryptStringToFile(S, 5, Application.ExeName+'.txt');

  s := ''; // <- hier wird String gekillt, wir wollen ja nicht cheaten :-)
  // in dieser Zeile holen wir den verschluesselten String zurück
  s := CryptFileToString(Application.ExeName+'.txt', 5);

  // mach was mit "s"
end;

So funktioniert es perfekt ich baue jetzt nur noch eine Speicherfunktion hintendran und versuche daraus zu lernen Vielen Vielen Dank!:-D

LG Noah

KodeZwerg 13. Jul 2018 00:07

AW: Variablentypen bei ord() erzeugen Fehler
 
Delphi-Quellcode:
procedure CryptStringToFile(const InputString: string; const Modifier: Byte; const Filename: String);
var
  s: string; // <<-- diese Zeile löschen, überbleibsel von all-in-one version
Als Lernprojekt würde ich Dir empfehlen meine Methode in einen Filestream umzuwandeln, das ist nicht all zu schwer und hat eine Steile Lernkurve.
Mein example ist nur QuickAndDirty, bei längeren Texten auch arg langsam da alles byteweise passiert und nicht als ein block.
Später kannst Du Dich dann mit XOR befassen, das wäre am einfachsten umzusetzen, ein sample Stand bereits hier im Thread.

Bei meiner Variante ist es halt wichtig das nach Möglichkeit nur Text als Input reinkommt, kann ruhig multiline sein.
Es gibt noch null Fehler kontrolle, ob zum Beispiel der Modifier Part die 255 überschreitet, deshalb keine zu großen wählen.
Für normalen ASCII (0..127) als Input ist 128 der maximale Modifier Faktor.
Weitere Kontrollen:
Ob eine Datei geöffnet/geschrieben/gelesen werden konnte etc....

Nox 13. Jul 2018 00:26

AW: Variablentypen bei ord() erzeugen Fehler
 
Liste der Anhänge anzeigen (Anzahl: 1)
Eine letzte frage warum funktioniert das bitte jetzt nicht mehr?

LG Noah

KodeZwerg 13. Jul 2018 00:30

AW: Variablentypen bei ord() erzeugen Fehler
 
writeln(f,.....

Nox 13. Jul 2018 00:30

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407109)
Du benutzt kein Konsolen-Programm, oder?

nein eine normale anwendung
LG Noah

KodeZwerg 13. Jul 2018 00:34

AW: Variablentypen bei ord() erzeugen Fehler
 
writeln(f,.....

hatte zu spät gelesen, bin müde :stupid:

Nox 13. Jul 2018 00:36

AW: Variablentypen bei ord() erzeugen Fehler
 
Liste der Anhänge anzeigen (Anzahl: 1)
najaaa...da geht irgendwas nicht :(

LG Noah

KodeZwerg 13. Jul 2018 00:43

AW: Variablentypen bei ord() erzeugen Fehler
 
Kopiere Deine Methode hier als Delphi-Code rein, ich muss mehr sehen, vor allem im oberen deklarations Bereich der hier fehlt.

Nox 13. Jul 2018 00:44

AW: Variablentypen bei ord() erzeugen Fehler
 
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  WorkDir: String;
  filename : string;
  Verschluesselt:TextFile;
  dateistring,output:String;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormActivate(Sender: TObject);
begin
//Programm duplizieren
  //Pfad des Programms herausfinden

  //WorkDir:= ParamStr(0);// aktuelles Arbeitsverzeichnis auslesen

  //Programm kopieren

  //copyfile(WorkDir,'C:\Users\Noah\Desktop\projekt1.exe');




end;
//String aus einer Datei laden Funktion
function LoadStringFromFile(sInFile: String; var sFileString: String): Boolean;
var
  FileStream: TFileStream;
begin
  Result := False;
  if not FileExists(sInFile) then Exit;
  FileStream := TFileStream.Create(sInFile, fmOpenRead);
  try
    if FileStream.Size <> 0 then begin
      SetLength(sFileString, FileStream.Size);
      FileStream.Read(sFileString[1], FileStream.Size);
      Result := True;
    end;
  finally FileStream.Free end;
end;
//Funktion Ende
//Funktion Verschlüsselung
procedure CryptStringToFile(const InputString: string; const Modifier: Byte; const Filename: String);
var
  i: Integer;
  b: Byte;
  f: file of Byte;
begin
  AssignFile(F, Filename);
  Rewrite(f);
  for i := 1 to Length(InputString) do
  begin
    b := Ord(InputString[i]) + Modifier;
    write(f, b);
  end;
  CloseFile(F);
end;
//Funktion Entschlüsselung
function CryptFileToString(const Filename: string; const Modifier: Byte): String;
var
  b: Byte;
  f: file of Byte;
begin
  AssignFile(F, Filename);
  Reset(F);
  Result := '';
  while not Eof(F) do
  begin
    Read(f, b);
    Result := Result + Char(b - Modifier);
  end;

  CloseFile(F);
end;
//Funktion Ende

procedure TForm1.Button1Click(Sender: TObject);

begin
//String laden (Dateipfad der umzuwandelnden Datei,Ziel String)
LoadStringFromFile(filename,dateistring);
//Verschlüsselung laden
CryptStringToFile(dateistring,StrToINt(Edit1.text),filename);

dateistring:= ''; // <- hier wird String gekillt (auf 0 gesetzt)







end;



procedure TForm1.Button2Click(Sender: TObject);
begin
 //Fileort durch Öffnungsdialog herausfinden
  if OpenDialog1.Execute then
   begin
     filename := OpenDialog1.Filename;


   end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  f:file of byte;
begin
// in dieser Zeile holen wir den verschluesselten String zurück
   dateistring:= CryptFileToString(filename,StrToINt(Edit1.text));
   showmessage(dateistring);
   filename:='C:\Users\Noah\Desktop\projekt1.exe';
//Speichern
AssignFile(f,filename);

Reset(f);

Write(f,dateistring);
CloseFile(f);

end;

procedure TForm1.Edit1Change(Sender: TObject);
begin

end;

end.

KodeZwerg 13. Jul 2018 00:55

AW: Variablentypen bei ord() erzeugen Fehler
 
Delphi-Quellcode:
var
  t: Textfile; // das hier für ReadLn() / WriteLn() funktioniert besser
begin
  AssignFile(t,Application.ExeName+'.txt');
  Rewrite(t); // <-- wenn Datei neu ist, so wird sie erzeugt.
  Writeln(t, dateistring);
  CloseFile(t);
end;

Nox 13. Jul 2018 01:00

AW: Variablentypen bei ord() erzeugen Fehler
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407116)
Delphi-Quellcode:
var
  t: Textfile; // das hier für ReadLn() / WriteLn() funktioniert besser
begin
  AssignFile(t,Application.ExeName+'.txt');
  Rewrite(t); // <-- wenn Datei neu ist, so wird sie erzeugt.
  Writeln(t, dateistring);
  CloseFile(t);
end;

leider funktioniert jetzt das speichern nicht mehr aber ist schon okay :)

LG Noah


EDIT: Habs geschafft!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 Uhr.
Seite 1 von 2  1 2      

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