![]() |
Eingabezahlen aus Editfeld in Bytearray einlesen
Hallo.
Ich hoffe ich bin hier richtig. Ich möchte Eingabezahlen unterschiedlicher Länge in ein Bytearray einlesen um sie dann später per chr in Buchstaben umzuwandeln. Z.B. Im Feld Edit1 wird folgendes eingegeben: "3 251 64 3". Dann soll ins erste Feld des Array die 3 ins zweite Feld die 251, ins 3. die 64 usw. Dann kann ich ja den String mit
Delphi-Quellcode:
einlesen.
Eingabe := Form1.Eingabe.Text
(Eingabe ist eine Stringvariable und Code ein Bytearray). Nun habe ich versucht es folgendermaßen in mein Array einzulesen:
Delphi-Quellcode:
Lleider funktioniert es nicht ('' ist kein gültiger Integerwert).
laenge := length(Eingabe);
repeat x:=0; repeat x:=x*10+strtoint(Eingabe[i]); i := i +1; until Eingabe[i+1] = ' '; code[i]:=x; i := i+1; until i = laenge; Kann mir bitte jemand helfen. |
Re: Eingabezahlen aus Editfeld in Bytearray einlesen
Hallo und herzlich willkommen in der DP :dp:
Die Eingabe ist ja ein String. Somit musst du diesen String erstmal am Trennzeichen - hier ein Leerzeichen - zerlegen und kannst dann die Werte in dein Byte-Array einlesen. Suche mal nach den Funktionen Pos, PosEx. |
Re: Eingabezahlen aus Editfeld in Bytearray einlesen
Danke für die Hilfe.
Das heißt ich muss noch ein String Array erstellen, den String bis zum Leerzeichen in das Stringarray kopieren, dann diesen Teil aus dem Ursprungsstring löschen und das Stringarray in mein ByteArray kopieren. Richtig? |
Re: Eingabezahlen aus Editfeld in Bytearray einlesen
Es geht einfacher.
Du gehst in einer Schleife solange mit PosEx durch, bis dies 0 ergibt und suchst nach Leerzeichen. Du kopierst aus der Eingabe bis zu dem Punkt wo das Leerzeichen ist in einen tempörären String (lokale Variable) und nun kannst du das in das Array überführen. IntToStr ist hierbei dein Freund. Edit:
Delphi-Quellcode:
Zum Verständnis mal eine unperformante Lösung. Im Forum findest du unter dem Stichwort
var
ofs : integer; text : string; tmp : string; byArray : array of byte; begin text := Edit1.Text; ofs := PosEx(#32, text); while ofs <> 0 do begin tmp := copy(text, 0, ofs - 1); SetLength(byArray, length(byArray) + 1); byArray[High(byArray)] := StrToInt(tmp); delete(text, 1, ofs); ofs := PosEx(#32, text, ofs); end; end; ![]() |
Re: Eingabezahlen aus Editfeld in Bytearray einlesen
Liste der Anhänge anzeigen (Anzahl: 1)
Nochmals vielen Dank. Ich denke ich habe es jetzt so implementiert und damit ein Problem gelöst.
Jedoch kommt immernoch diesselbe Fehlermeldung. :pale: Mein aktueller Quellcode ist der folgende (das Programm liegt nochmals im Anhang bei): Der Fehler tritt bei der Prozedur TForm1.Button2Click unter case of :3 auf.
Delphi-Quellcode:
Ich hoffe mir kann jemand helfen.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, math; type TForm1 = class(TForm) Label1: TLabel; RadioGroup: TRadioGroup; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Button1: TButton; Benutzeranweisung: TLabel; Eingabeanweisung: TLabel; Information1: TLabel; Information2: TLabel; Ausgabeinformation: TLabel; B1: TLabel; B2: TLabel; Eingabe: TEdit; Ausgabe: TLabel; Button2: TButton; Zusatzlabel: TLabel; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function ggt(a,b:integer):integer; begin while b<>0 do if a > b then a:=a - b else b:=b - a; ggt:=a; end; Function isPrimzahl(Value: integer): Boolean; Var i, t: Integer; Begin t := round(sqrt(Value)); For i := 2 To t Do If Value Mod i = 0 Then Begin result := false; exit; End; result := true; End; function PosEx(const Substr: string; const S: string; Offset: Integer): Integer; begin if Offset <= 0 then Result := 0 else Result := Pos(Substr, Copy(S, Offset, Length(S))); if Result <> 0 then Result := Result + Offset - 1; end; procedure TForm1.Button1Click(Sender: TObject); begin case radiogroup.ItemIndex of 0: begin Label5.Caption := 'P'; Label6.Caption := 'Q'; Label3.Caption := 'Primzahlen'; Eingabe.Visible := false; Zusatzlabel.Visible := true; Benutzeranweisung.Caption := 'Bitte geben Sie die Primzahlen P und Q ein.'; Eingabeanweisung.Caption := 'Berechnung von N:'; Information1.Caption := 'Berechnung von M:'; Information2.Caption := 'Berechnung von E:'; Ausgabeinformation.Caption := 'Berechnung von D:'; B1.Caption := ''; B2.Caption :=''; Ausgabe.Caption := ''; end; 1: begin Label5.Caption := 'N'; Label6.Caption := 'E'; Label3.Caption := 'öffentlich'; Zusatzlabel.Visible := false; Eingabe.Visible := true; Benutzeranweisung.Caption := 'Bitte geben Sie die öffentlichen Schlüssel E und N ein.'; Eingabeanweisung.Caption := 'Bitte geben Sie den zu verschlüsselnden Text ein:'; Information1.Caption := 'Umwandlung der Buchstaben in Zahlen:'; Information2.Caption := 'Anwendung des Verschlüsselungsalgorithmus (C=K^E mod N):'; Ausgabeinformation.Caption := 'verschlüsselter Text'; B1.Caption := ''; B2.Caption :=''; Ausgabe.Caption := ''; end; 2: begin Label5.Caption := 'N'; Label6.Caption := 'E'; Label3.Caption := 'öffentlich'; Zusatzlabel.Visible := false; Eingabe.Visible := true; Benutzeranweisung.Caption := 'Bitte geben Sie den privaten Schlüssel D ein.'; Eingabeanweisung.Caption := 'Bitte geben Sie den zu entschlüsselnden Text ein:'; Information1.Caption := 'Anwendung des Entschlüsselungsalgorithmus (K=C^D mond N):'; Information2.Caption := 'Umwandlung der Zahlen in Buchstaben:'; Ausgabeinformation.Caption := 'entschlüsselter Text'; B1.Caption := ''; B2.Caption :=''; Ausgabe.Caption := ''; Edit1.Text := ''; end; end end; procedure TForm1.Button2Click(Sender: TObject); var p, i,j ,q,ofs, n, d,position, m, e, laenge, klartextlaenge : integer; speicher : extended; tmp : string; Eingabe, Ausgabe : AnsiString; code: array of byte; begin case radiogroup.ItemIndex of 0: begin p := strtoint(edit1.Text); //Einlesen der Eingabewerte q := strtoint(edit3.Text); if (IsPrimzahl(p)=false) or (IsPrimzahl(q)=false) or (p=q) then Messagebox(0,'Bitte geben sie zwei unterschiedliche Primzahlen für P und Q ein. Ansonsten wird der Verschlüsselungsalgorithmus mit hoher Wahrscheinlichkeit nicht funktionieren','Warnung',MB_OK); n := p*q; //Bestimmen von n m := (p-1)*(q-1); //Bestimmen von m i := 2; //Bestimmen von e repeat e := i; i := i+1; until (i+1 = n) or (ggt(e,m)=1); i := 1; repeat //Bestimmen von d d := i; i := i+1; until ((d*e)mod m =1) and (d <> e); Zusatzlabel.Caption := inttostr(n); //Ausgabe der Schlüssel B1.Caption := inttostr(m); B2.Caption :=inttostr(e); Form1.Ausgabe.Caption := inttostr(d); Edit1.Text := inttostr(n); Edit2.Text := inttostr(d); Edit3.Text := inttostr(e); end; 1: begin Eingabe := Form1.Eingabe.Text; //Einlesen der Eingabewerte e :=strtoint(edit3.Text); n :=strtoint(edit1.Text); Eingabe := Form1.Eingabe.Text; laenge := length(Eingabe); SetLength(Code, laenge+1); for i := 1 to laenge do code[i] := ord(Eingabe[i]); Ausgabe :=''; for i:=1 to laenge do begin //Ausgabe des verschlüsselten Textes Ausgabe := Ausgabe + ' ' + inttostr(code[i]); end; B1.Caption := Ausgabe; for i := 1 to laenge do begin //Anwendung des Verschlüsselungalgorithmusses speicher := 1; for j := 1 to e do begin speicher := speicher * code[i]; speicher := speicher - (Trunc(speicher/n) * n); //modfunktion für extended end; code[i] := round(speicher); end; Ausgabe :=''; for i:=1 to laenge do begin //Ausgabe des verschlüsselten Textes Ausgabe := Ausgabe + ' ' + inttostr(code[i]); end; B2.Caption := Ausgabe; end; 2: begin Eingabe := Form1.Eingabe.Text; //Einlesen der Eingabewerte laenge := length(Eingabe); d :=strtoint(edit2.Text); n :=strtoint(edit1.Text); klartextlaenge := 0; ofs := PosEx(#32, Eingabe, 0); while ofs <> 0 do begin tmp := copy(Eingabe, 0, ofs - 1); SetLength(code, length(code) + 1); code[High(code)] := StrToInt(tmp); delete(Eingabe, 1, ofs); ofs := PosEx(#32, Eingabe, ofs); end; //repeat //Einteilen des Strings in Einzelzahlen //position := PosEx(' ', Eingabe, 1); //Delete(Eingabe, 1, position); //zwischenspeicherstring := Copy(Eingabe, 1, position-1); //klartextlaenge := klartextlaenge + 1; //code[klartextlaenge] := strtoint(zwischenspeicherstring); //until PosEx(' ', Eingabe, 1) =0; Ausgabe := ''; //Ausgabe der Einzelzahlen for i:=1 to klartextlaenge do begin Ausgabe := Ausgabe + inttostr(code[i]); end; B1.Caption := Ausgabe; for i := 1 to klartextlaenge do begin //Anwendung des Verschlüsselungalgorithmusses speicher := 1; for j := 1 to d do begin speicher := speicher * code[i]; speicher := speicher - (Trunc(speicher/n) * n); //modfunktion für extended end; code[i] := round(speicher); end; Ausgabe := ''; //Augabe des Entschlüsselten Textes for i:=1 to klartextlaenge do begin Ausgabe := Ausgabe + chr(code[i]); end; B2.Caption := Ausgabe; end; end; end; end. |
Re: Eingabezahlen aus Editfeld in Bytearray einlesen
hab mir deinen source jetzt nich durchgelesen... wollte nur nochmal ne möglichkeit
anmerken wie man recht kompfortabel den string aus deinem eingangspost zersplitten kann. wenns nich unbedingt ein super schneller, extra angepasster algo sein muß, kann man auch ne TStringList dafür nehmen. is auf jeden fall sehr übersichtlich im source:
Delphi-Quellcode:
var
List: TStringList; i, Zahl: Integer; begin List := TStringList.Create; try List.Delimiter := ' '; List.DelimitedText := Edit1.Text; for i:=0 to List.Count-1 do begin Zahl := StrToInt(List[i]); showmessage(IntToStr(Zahl)); end; finally List.free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 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-2025 by Thomas Breitkreuz