Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Ord()?!


Robii - Di 15.12.09 22:11
Titel: Ord()?!
Hallo Leute, ich hab eine Funktion geschrieben, in der ich einen String umwandeln möchte in die Ascii-Werte.
Leider klappt dies nicht.

Quellcode

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm2.bCryptClick(Sender: TObject);
var
  cS,dS,bS: string;

  i,iB: Integer;
begin
  dS := Log.Text;
  for i := 1 to Length(dS) do
    begin
      bS:= dS[i];
      iB:= ord(bS);
      cS:= cS+' '+IntToStr(iB);
      iB:=0;
    end;
  Log.Clear;
  Log.Text:=cS;
  Log.Lines.Add(Char(6011428));
end;


Wenn ich z.B. 'a b c d e f g h i j k l m n o p q r s t u v w x y z' eingebe und umwandeln lasse,
komtm folgendes herraus:
Zitat:

17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980 17939412 17938980


Und das kann ja nicht sein, den die Zahlen wiederholen sich ja.
Wieso?

Lieben Gruß.

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Muck - Di 15.12.09 22:29

Hallo,

ord sollte ein Char und nicht einen String als Parameter haben.

Versuche:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
  cS,dS,bS: string;
  i,iB: Integer;
begin
  dS := Log.Text;
  for i := 1 to Length(dS) do
    begin
      bS:= dS[i];
      iB:= ord(bS[1]); // erste stelle des string
      cS:= cS+' '+IntToStr(iB);
      iB:=0;
    end;
  Log.Clear;
  Log.Text:=cS;
  Log.Lines.Add(Char(6011428));


oder kuerzer: (kannst Dir iB und bS sparen)

Delphi-Quelltext
1:
cs:=cs+' '+IntToStr(ord(dS[i]));                    


bis denne


Robii - Di 15.12.09 22:34

Danke für die fixe Antwort.

So ein Fehler hätte mir eigentlich auch auffallen dürfen.
Peinlich, aber Danke.

Lieben Gruß.

E: Hab da noch eine Frage.

Und zwar habe ich jetzt einen String der so aufgebaut ist:
' XX XX XXX XX '
Die Anzahl der X'e ist nun wilkürlich gewählt.
Jetzt möchte ich mit diesem Befehl

Delphi-Quelltext
1:
    bS:= Copy(cS,2,Pos(' ',cS)-1);                    

In dem String bS die ersten beiden XX speichern und per Char() wieder zurück verwandeln. Bei mir kommt immer eine Fehlermeldung das "" kein Integer ist.

Lieben Gruß

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Habs dann bis jetzt so hinbekommen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
begin
  cS := Log.Text;
  for i := 0 to Length(cS) - 1 do
  begin
    if(cS[1]=' ')
      then Delete(cS,1,1);
    bS:= Copy(cS,1,AnsiPos(' ',cS)-1);
    bs2:= Char(StrToInt(bS));
    Delete(cS,1,AnsiPos(' ',cS));
    cS:= bs3;
  end;


Aber irgendwas stimmt da noch nicht, denn, das erste mal läuft die Schleife durch
und beim 2ten Mal, nicht mehr mit dem gleichen Fehler wie oben.

Folgenden String will ich umwandeln:
Zitat:
336 138 264 348 111 150 138 228 300 309 216 315 501 153 150 138 99 144 39 30


Aber irgendwie haut das nicht hin.
Wär nett, wenn mir nochmal jemand hilft.

Lieben Gruß.

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Narses - Di 15.12.09 23:24

Moin!

Erstes Problem:
user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Folgenden String will ich umwandeln:
Zitat:
336 138 264 348 111 150 138 228 300 309 216 315 501 153 150 138 99 144 39 30
Die markierten Werte sind nicht im Wertebereich von Char(), das kann also schonmal nicht klappen. :nixweiss:

Wenn es nur Werte von 0..255 sind, dann probier das mal so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  var
    Werte: TStringList;
    i: Integer;
    Ausgabe: String;
begin
  Werte := TStringList.Create;
  try
    Werte.CommaText := Log.Text;
    Ausgabe := '';
    for i := 0 to Werte.Count-1 do
      Ausgabe := Ausgabe +Chr(StrToIntDef(Werte.Strings[i],32));
    Log.Text := Ausgabe;
  finally
    Werte.Free;
  end;

cu
Narses

//EDIT: Char() in Chr() korrigiert.


Robii - Di 15.12.09 23:35

Zuerst, sorry, hatte mich vertippt, ich meine nicht Char() sondern Chr().

Wenn ich jetzt deine Funktion benutze (Narses), dann klappt diese auch wunderbar, allerdings wird nicht der gleiche String wieder entziffert, wie ich ihn vorher mit Ord() umgewandelt habe. Es kommen also andere Zeichen herraus, wieso?

Lieben Gru0ß & Danke.

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


Narses - Di 15.12.09 23:39

Moin!

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich jetzt deine Funktion benutze (Narses), dann klappt diese auch wunderbar, allerdings wird nicht der gleiche String wieder entziffert, wie ich ihn vorher mit Ord() umgewandelt habe. Es kommen also andere Zeichen herraus, wieso?
Keine Ahnung, zeig mal deinen Encoder. :nixweiss:

cu
Narses


Robii - Di 15.12.09 23:42

Also das hier sind die beiden Funktionen:

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:
procedure TForm2.bCryptClick(Sender: TObject);
var
  cS,dS: string;
  i: Integer;
begin
  dS := Log.Text;
  for i := 1 to Length(dS) do
    begin
      cS:= cS+' '+IntToStr(Ord(dS[i])*3);
    end;
  Log.Clear;
  Log.Text:=cS;
end;

procedure TForm2.bDecryptClick(Sender: TObject);
var
  Werte: TStringList;
  i: Integer;
  Ausgabe: String;
begin
  Werte := TStringList.Create;
  try
    Werte.CommaText := Log.Text;
    Ausgabe := '';
    for i := 0 to Werte.Count-1 do
      Ausgabe := Ausgabe +Chr(StrToInt(Werte.Strings[i]));
    Log.Text := Ausgabe;
  finally
    Werte.Free;
  end;
end;


Allerdings glaube ich liegt das daran, das ich die Leerzeichen ja mit umwandel, oder nicht?
Jetzt bin ich grade verunsichert :?

Lieben Gruß.


Narses - Di 15.12.09 23:47

Moin!

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Allerdings glaube ich liegt das daran, das ich die Leerzeichen ja mit umwandel,
Nein, es liegt daran, dass du:

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
procedure TForm2.bCryptClick(Sender: TObject);
//...
      cS:= cS+' '+IntToStr(Ord(dS[i])*3);
die Zeichenwerte *3 nimmst, aber nicht wieder durch 3 teilst, beim decodieren. ;)

cu
Narses


Robii - Di 15.12.09 23:50

Ah, irgendwie bin ich Heute leicht daneben.

Danke schön, hatte ganz vergessen, das unten wieder rückgänig zu machen.

Danke, klappt jetzt.
Lieben Gruß.