Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zahl in Ascii Zeichenfolge umwandeln


daywalker0086 - Di 12.06.18 17:39
Titel: Zahl in Ascii Zeichenfolge umwandeln
Hallo Freunde des Orakels,
ich wollte mal fragen wie ich am besten eine Zahl in ihre Ascii Repräsentation umwandle.
Folgendes soll erreicht werden:

zahl: integer;
ascii: string;

ascii := zahl -->
das heißt ich habe als Zahl 31.
Jetzt soll dies umgewandelt werden zu ascii 3331

oder 1 zu 31

Die Zahlen werden nicht größer als zweistellig als 99 zu 3939

Hat da jemand eine schnelle Lösung?

Grüße Christian


ub60 - Di 12.06.18 18:40

Eventuell so, wobei SZahl schon die als String umgewandelte Zahl ist:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var SZahl, Ascii: String;
    i: Integer;
begin
  SZahl:=EditZahl.Text;
  Ascii:='';
  for i:=1 to Length(SZahl) do
    Ascii:=Ascii+IntToHex(Ord(SZahl[i]), 2);
  EditAscii.Text:=Ascii;
end;

ub60


daywalker0086 - Do 14.06.18 18:23

Dankeschön ub60,
läuft :D


GuaAck - Sa 16.06.18 22:00

Hallo,

warum nicht einfach SZahl:=inttostr(zahl)?

Habe ich da eine feinheit übersehen?

Gruß GuaAck


jaenicke - Sa 16.06.18 22:32

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
warum nicht einfach SZahl:=inttostr(zahl)?

Habe ich da eine feinheit übersehen?
Ja. ;-)
Sieh dir mal das Beispiel an. Aus der Zahl 31 soll 3331 werden, sprich Asciizeichen 3 entspricht hexadezimal 33 [https://www.torsten-horn.de/techdocs/ascii.htm], Asciizeichen 1 wiederum 31. Daher kommt dann 3331 heraus.


Narses - Sa 16.06.18 23:07

Moin!

Ich verstehe den Aufwand nicht, reden wir nicht von BinToHex() und HexToBin()? Hab grad kein Delphi zur Hand, aber ich könnte schwören sowas schonmal benutzt zu haben... :gruebel:

cu
Narses


jaenicke - Sa 16.06.18 23:38

BinToHex ist das richtige, ja.


ub60 - So 17.06.18 11:10

@Narses:

Meintest Du so was:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var SZahl, Ascii: String;
begin
  SZahl:=EditZahl.Text;
  SetLength(Ascii, 2*Length(SZahl));
  BinToHex(PChar(SZahl), PChar(Ascii), Length(SZahl));
  EditAscii.Text:=Ascii;
end;

Bin mir gerade bei der Syntax nicht sicher, aber es funktioniert :P .

ub60


GuaAck - So 17.06.18 11:37

Hallo alle,

ich habe mal ein kleines Testprogramm gemacht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
  f: textfile;
  s: STRING;
  i: integer;
  p: ARRAY[0..1OF char;
BEGIN
  i := 31;
  assignfile(f, 'Test.txt');
  rewrite(f);
  s := inttostr(i);
  writeln(f, 'inttostr:', s);
  s := inttohex(i, 2);
  writeln(f, 'inttohex:', s);
  bintohex(pchar(@i), pchar(@p), 1);
  writeln(f, 'bintohex:', p);
  closefile(f);
END;


Dann sehe ich mir die Datei "Test.txt" mit einem HEX-Viewer an und sehe:
inttostr:31
inttohex:1F
bintohex:1F

Dump

(HEX-Dump auch im Anhang)

Demnach gibt doch nur inttostr wie gewünscht die 3331 zurück.

Gruß GuaAck


jaenicke - So 17.06.18 16:30

Es ging um einen String mit dem Inhalt 31. Sprich deine Variable s. Schreibst du die mit BinToHex weg, kommt das richtige heraus.


GuaAck - So 17.06.18 23:14

Sorry Jaenicke,

in der Ausgangsfrage stand:
Zitat:

zahl: integer;
ascii: string;

ascii := zahl -->
das heißt ich habe als Zahl 31.
Jetzt soll dies umgewandelt werden zu ascii 3331


Die 31 ist als Integer gemeint, nicht als String. Ich bleibe bei meinem Votum für inttostr.

Gruß
GuaAck


Narses - So 17.06.18 23:20

Moin!

Aber in dem anderen Thread des TE geht´s genau darum: einen binären Inhalt hexstring-encoded zu senden, also macht es durchaus Sinn. ;)

cu
Narses


Delete - Mo 18.06.18 08:47

- Nachträglich durch die Entwickler-Ecke gelöscht -


Narses - Mo 18.06.18 12:30

Moin!

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Das sollte beide Parteien glücklich stimmen:
Wenn schon zur Wiederverwendung formalisiert, dann solltest du unbedingt auf die generischen Typen verzichten und z.B. AnsiString erzwingen. :idea: Das knallt sonst in Unicode-Delphi-Versionen. :?

cu
Narses


Delete - Di 19.06.18 02:33

- Nachträglich durch die Entwickler-Ecke gelöscht -