Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Buchstabe/Zahl zu ASCII Code und umgekehrt


darkdester - Fr 22.10.04 17:03
Titel: Buchstabe/Zahl zu ASCII Code und umgekehrt
Ok sollte ja neues topic machen wenn ichs net kapier^^.

Ok ich bitte freundlcih das mit jemand ncohmal das mit den Asccicode erklärt.

Ich will mehrere buchstaben-zahlenkombis in asciicode umwandeln.

und dann weider zurück

wie mach ich das?


ihr wäre ecuh sehr sehr dankbar

1000 dank im voraus

MFG darkdester


Luzzifus - Fr 22.10.04 17:13

Das machst du mit den beiden Funktionen ORD und CHR. ORD wandelt Buchstaben in ihre ASCII-Codierung um (ShortInt bzw. Byte) und CHR macht das Gegenteil.

kleines Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var 
  x: String;
  y: Array[0..255of Integer;
  i: Integer;

begin
  x:='Hallo, du da!!';
  for i:=Low(x) to High(x) do
    y[i]:=ORD(x[i]);
end;

Danach hast du die einzelnen Buchstaben des Strings x als ShortInt- (Byte-) Werte in dem Array y liegen. Low(x) und High(x) stehen für das erste bzw. das letzte Element des Strings. Alternativ kannst du schreiben:


Delphi-Quelltext
1:
for i:=1 to Length(x) do                    


andersrum:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var 
  x: String;
  y: Array[0..255of Integer;
  i: Integer;

begin
  x:='';
  for i:=Low(y) to High(y) do
    x:=x+CHR(y[i]);
  ShowMessage(x);
end;

Das schreibt die ShortInt-Werte aus dem Array wieder zurück in den String x und zeigt dir danach ne MessageBox mit dem String.

Das Array hab ich jetzt mal nicht dynamisch gemacht, sondern ihm zur Vereinfachung eine feste Länge zugewiesen.


darkdester - Fr 22.10.04 17:19

danke mal sehn obs klappt wie ich das will


jasocul - Fr 22.10.04 17:20

Du beziehst dich vermutlich auf die Frage, was die Chr-Funktion so macht.
Diese Funktion erwartet als Argument eine Zahl vom Type Byte.
Das Resultat der Funktion ist dann ein Zeichen (Type Char).

Delphi-Quelltext
1:
  ShowMessage(Chr(65));                    


Das Beispiel zeigt den Buchstabe 'A', da der ASCII-Wert von 'A' gleich 65 ist.

Irgendwelche Buchstaben kannst du nicht als Argument übergeben.

Der umgekehrte Weg geht mit der Ord-Funktion


Luzzifus - Fr 22.10.04 17:27

ach nochwas:

Da du ja meinen Hinweis im anderen Thread ignoriert hast, dich vielleicht erst einmal ein bisschen zu belesen, was Delphi betrifft, hier mal zwei Links:

http://www.delphi-tutorials.de/
http://www.delphi-source.de/tutorials/

Da gibt's jeweils gute Einsteiger-Tutorials, die die allermeisten deiner Fragen sicher beantworten können und dir zusätzlich einfach ein gewisses Grundwissen zur Programmierung mit Object-Pascal und Delphi vermitteln können.


darkdester - Fr 22.10.04 17:31

gibts bei den array ne weiten begrenzung?
weil beim string musste ich schon sehn max 255 zeichen -.-


Luzzifus - Fr 22.10.04 17:35

Beim Array gibt's keine Begrenzung. Wenn es sehr lang werden soll, würd ich aber empfehlen es dynamisch zu machen (also keine feste Länge), ganz einfach damit nicht unnötig Speicherplatz verschwendet wird.

Ein ShortString ist auf 255 Zeichen beschränkt, ein normaler String nicht. Es gibt ausserdem noch AnsiString (2^31 ASCII-Zeichen) und WideString (2^31 Unicode Zeichen).


jasocul - Fr 22.10.04 17:38

Folgendes ist freundlich gemeint und soll nicht unfair sein:
Bitte lies doch erst die OH. Wenn du es dann nicht verstehst, wird dir sicher geholfen. Das was du fragst, ist Basis-Wissen. Nimm doch unsere Ratschläge an und lies die Tutorials.

Zu deiner Frage:
Strings sind NICHT auf 255 Zeichen begrenzt.
Bei einem Array ist es eine Frage des Speichers.


darkdester - Fr 22.10.04 17:41

jasocul hat folgendes geschrieben:
Folgendes ist freundlich gemeint und soll nicht unfair sein:
Bitte lies doch erst die OH. Wenn du es dann nicht verstehst, wird dir sicher geholfen. Das was du fragst, ist Basis-Wissen. Nimm doch unsere Ratschläge an und lies die Tutorials.

Zu deiner Frage:
Strings sind NICHT auf 255 Zeichen begrenzt.
Bei einem Array ist es eine Frage des Speichers.


udn weiso kam dann fehler: strin-literale können nur 255 zeichen enthalten?


anaj egal ich les tuts nur hab ich ka zeit alles per ahnd zu suchen

andere frage die steht bestimmt ner so im tut

wie les ich nun das komplette array aus?


EDIT:habs gefunden xD


Luzzifus - Fr 22.10.04 17:41

jasocul hat folgendes geschrieben:
Zu deiner Frage:
Strings sind NICHT auf 255 Zeichen begrenzt.

Achja stimmt, das war der ShortString der auf 255 Zeichen begrenzt ist. Sorry dafür.. ^^ (ich ändere das oben besser mal..)

Zitat:
andere frage die steht bestimmt ner so im tut
wie les ich nun das komplette array aus?

Stimmt die steht so nicht im Tutorial. Aber Programmieren ist ein wenig mit Kreativität verbunden und wenn du die ersten zwei bis drei Kapitel gelesen hast kannst du die Frage selbst beantworten.

Ausserdem habe ich das oben schon gemacht, ich habe nämlich mittels einer FOR-SCHLEIFE das GESAMTE ARRAY in Buchstaben umgewandelt und in den String geschrieben. :wink:


darkdester - Fr 22.10.04 17:47

ehm weil ich das ( http://www.delphi-source.de/tipps/sprache/?id=163 ) gefunden hab ne frage

mein delphi erkennt diese SumInt net als befehl Oo


Luzzifus - Fr 22.10.04 17:49

Wahrscheinlich hast du vergessen, die Unit Math in die uses zu schreiben (steht in der ersten Zeile des Tipps).


darkdester - Fr 22.10.04 17:52


Delphi-Quelltext
1:
2:
3:
4:
5:
x:='Hallo, du da!!';     //löschen
  for i:=0 to Length(x)-1 do   //löschen
    y[i]:=ORD(x[i]);      //löschen
    summe:=SumInt(y);
    Memo2.Text:=InttoStr(summe);


so DAS plus das math oben müsste doch stimmen?

jetzt gibts en integer overflow oda so , integerüberlauf...

och man ><

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.


Luzzifus - Fr 22.10.04 17:57

Das Problem an der Stelle ist dass das Array nicht dynamisch ist, sondern die feste Länge 256 hat. Und da du's sicher nicht initialisiert hast, wird der komplette Speichermüll der in den nicht zugewiesenen Feldern des Arrays steht, mit aufsummiert.

schreibe mal das hier vor die Stelle wo du Zahlen in das Array schreibst:

Delphi-Quelltext
1:
2:
for i:=Low(y) to High(y) do
  y[i]:=0;

Dann sollte das nicht mehr passieren.


darkdester - Fr 22.10.04 18:05


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
x:='Hallo, du da!!';     //löschen
  for i:=Low(y) to High(y) do
  y[i]:=0;
  for i:=0 to Length(x)-1 do   //löschen
    y[i]:=ORD(x[i]);      //löschen
    summe:=SumInt(y);
    Memo2.Text:=InttoStr(summe);



es geht aba er gibt mir nur ne 4 stellige zahl aus O.o

boah ich kann net mehr ><


edit: bin an lösung dran

ich kann das prob mit dem integer string addieren net lösen der solls ja net addieren <<


Luzzifus - Fr 22.10.04 18:10

Ja vielleicht ist deine Summe halt nur vierstellig.. :twisted:

Falls nicht gibt mal den restlichen Quelltext her, mit dem du Zahlen ins Array schreibst.


Christian S. - Fr 22.10.04 18:16

Ist x ein String? Dann solltest Du beachten, dass die Indizierung eines Strings bei 1 und nicht bei 0 beginnt!


darkdester - Fr 22.10.04 18:24

Luzzifus hat folgendes geschrieben:
Ja vielleicht ist deine Summe halt nur vierstellig.. :twisted:

Falls nicht gibt mal den restlichen Quelltext her, mit dem du Zahlen ins Array schreibst.


allein "Hallo" ergibt schon mehr als 4 stellen in ascii code <<

indizierung x.X?

x ist ein string



ok hier nochmal bisheriger code


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var         //löschen
x: String;                    //löschen
  y: Array[0..2000of Integer;    //löschen
  i: Integer;                   //löschen
   summe: integer;
begin
x:='Hallo, du da!!';     //löschen
  for i:=Low(y) to High(y) do
  y[i]:=0;
  for i:=0 to Length(x)-1 do   //löschen
    y[i]:=ORD(x[i]);      //löschen
    summe:=InttoStr(SumInt(y));
    Memo2.Text:=InttoStr(summe);

end;



problem: ausgabe von 1051 obwohl FALSCH


Luzzifus - Fr 22.10.04 18:34

SumInt hängt nicht die Zahlen aneinander sondern addiert sie.

ich war so frei und hab das für 'Hallo, du da!!' mal von Hand ausgerechnet:
72+97+108+108+111+44+32+100+117+32+100+98+33+33 = 1085

Wo bitte ist das nicht vierstellig? :wink:


darkdester - Fr 22.10.04 18:36

Luzzifus hat folgendes geschrieben:
SumInt hängt nicht die Zahlen aneinander sondern addiert sie.

ich war so frei und hab das für 'Hallo, du da!!' mal von Hand ausgerechnet:
72+97+108+108+111+44+32+100+117+32+100+98+33+33 = 1085

Wo bitte ist das nicht vierstellig? :wink:


ich wills aba NICHT addieren er soll mir die asciiwerte hintereinander schreiben

geht das irgendwie??
da kommt derwing 1051 raus :roll:


Luzzifus - Fr 22.10.04 18:40

Ja das geht. Das hab ich in meinem ersten Post zu diesem Thema schon gemacht.

Hier nochmal, gleich für dein Memo angepasst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var   
  x: String
  y: Array[0..255of Integer; 
  i: Integer;  
begin  
  x:='';  
  for i:=Low(y) to High(y) do  
    x:=x+CHR(y[i]);  
  Memo2.Text:=x;  
end;


Zitat:
da kommt derwing 1051 raus

Vielleicht hab ich mich bei den Leerzeichen oder den Ausrufezeichen vertan. Ist relativ egal, weil mehr als 4 Stellen werden's trotzdem nicht. ;)


Kroni - Sa 23.10.04 00:17

wenn du einfach nur die Werte hintereinander anzeigen willst, dann musst du von jedem Zeichen den Ascii-Code ermitteln, und dann die Zahl in eine String umwandeln, und diesen dann in einem String speichern. Das sähe dann so aus:
1. String leeren, in dem du die Ascii-Coeds speicherst.
2. du gehst jedes zeichen druch (das kannst du ja schon)
3. du weist dem String, in dem du den Ascii-Code speichern willst, die Ziffern als zeichen zu. Dazu musst du die Ziffern mit IntToStr(Ascii-Code) umwandeln.
Mit dem + Operator kannst du dann der Zeichenkette den String anhängen.
Dann musst du die Ziffern nämlich als String behandeln, damit die Ziffern nicht addiert, sondern hintereinander als String gehängt werden (mit dem + Operator)!
also dann

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var 
  x,asciizeichen: String;
  y: Array[0..255of Integer;
  i: Integer;

begin
  asciizeichen:='';
  x:='Hallo, du da!!';
  for i:=Low(x) to High(x) do
    begin
    y[i]:=ORD(x[i]);
    asciizeichen:=asciizeichen+'+'+inttostr(y[i]);//hängt an dem String die Zahlen hinten dran
    end;
   showmessage(asciizeichen);
end;

Probiers mal!


Luzzifus - Sa 23.10.04 10:07

Das funktioniert bei ihm jetzt soweit, ich hab gestern noch ne ganze Weile über ICQ mit ihm geredet..