![]() |
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:
Vielen Dank fürs Angucken Noah!
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; |
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) |
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 |
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; |
AW: Variablentypen bei ord() erzeugen Fehler
Delphi-Quellcode:
Mit rewrite legt man eine Datei neu an! Aus Deinem Kommentar entnehme ich, daß Du eigentlich lesen willst. Dafür gibt es 'Reset(Verschluesselt)'.
ReWrite(Verschluesselt);
//Datei auslesen ReadLn(Verschluesselt,zurueckZahlStr); |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
Dieser ist der Anfangsbuchstabe des verschlüsselten Textinhalts. Kann es sein das nur ein Buchstabe in Ascii übersetzt wird? |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
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 |
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; |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
|
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
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 |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
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 |
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:
Wenn man 'Test' eingibt, ist die Ausgabe 'Udru'.
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. 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). |
AW: Variablentypen bei ord() erzeugen Fehler
Delphi-Quellcode:
Tut mir leid wenn das nervt...
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. LG Noah |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
Zitat:
Zitat:
Zitat:
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). |
AW: Variablentypen bei ord() erzeugen Fehler
Delphi-Quellcode:
Das sollte das machen was Du möchtest, Dateinamen ersetzen und ab gehts :-D
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; 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. |
AW: Variablentypen bei ord() erzeugen Fehler
kribbelige Finger
|
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:
Gruß
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; K-H |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
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? |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
Sollte es noch ein Problemchen geben schreibe ich wieder :) LG Noah |
AW: Variablentypen bei ord() erzeugen Fehler
Bin damit raus, viel Glück.
|
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
|
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
Ein maximaler Abstand von Strings? LG Noah |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
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. |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
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 |
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 ![]() |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
Die beiden verwendeten Prozeduren:
Delphi-Quellcode:
Der Button:
//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
Delphi-Quellcode:
LG Noah
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; |
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 |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
Wenn ja wie? Tut mir leid aber ich zwinge auch niemandem mir zu helfen. LG Noah |
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:
So hier Aufrufen:
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;
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; |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
LG Noah |
AW: Variablentypen bei ord() erzeugen Fehler
Delphi-Quellcode:
Als Lernprojekt würde ich Dir empfehlen meine Methode in einen Filestream umzuwandeln, das ist nicht all zu schwer und hat eine Steile Lernkurve.
procedure CryptStringToFile(const InputString: string; const Modifier: Byte; const Filename: String);
var s: string; // <<-- diese Zeile löschen, überbleibsel von all-in-one version 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.... |
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 |
AW: Variablentypen bei ord() erzeugen Fehler
writeln(f,.....
|
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
LG Noah |
AW: Variablentypen bei ord() erzeugen Fehler
writeln(f,.....
hatte zu spät gelesen, bin müde :stupid: |
AW: Variablentypen bei ord() erzeugen Fehler
Liste der Anhänge anzeigen (Anzahl: 1)
najaaa...da geht irgendwas nicht :(
LG Noah |
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.
|
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. |
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; |
AW: Variablentypen bei ord() erzeugen Fehler
Zitat:
LG Noah EDIT: Habs geschafft! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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