Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Hex-Werte an String hängen (https://www.delphipraxis.net/162089-hex-werte-string-haengen.html)

Caleb 5. Aug 2011 13:36

Hex-Werte an String hängen
 
Hallo,

ich steh irgendwie grad vor einem Denkproblem ...

Kann mir jemand erklären wie ich Hex-Werte an ein String dranhängen kann?

So funktionierts schonmal nicht =/
Delphi-Quellcode:
procedure TForm1.foo;
var
  Temp:String;
begin
  Temp := 'W' + $03 + $F9 + $A7;
end;
Mir auch schon irgendwie einleuchtend warums der Compiler nicht zulässt, aber wie löst man denn das Problem?

Luckie 5. Aug 2011 13:37

AW: Hex-Werte an String hängen
 
Was soll denn da bitte bei rauskommen? Was sind das für Hexadezimalwerte? Oder suchst du die Funktion Chr?

DeddyH 5. Aug 2011 13:39

AW: Hex-Werte an String hängen
 
[klugscheiß]Und genau genommen gibt es keine Hex-Werte, sondern höchstens eine hexadezimale Zahlendarstellung.[/klugscheiß]

Neutral General 5. Aug 2011 13:40

AW: Hex-Werte an String hängen
 
@Luckie: Schätze schon.

Entweder (wie Luckie sagte) mit Chr() oder mit einem # vor der Zahl:

Delphi-Quellcode:
procedure TForm1.foo;
var
  Temp:String;
begin
  Temp := 'W' + Chr($03) + Chr($F9) + Chr($A7);
end;

procedure TForm1.foo;
var
  Temp:String;
begin
  Temp := 'W' + #$03 + #$F9 + #$A7;
end;

himitsu 5. Aug 2011 13:48

AW: Hex-Werte an String hängen
 
Zitat:

Zitat von Luckie (Beitrag 1115264)
Oder suchst du die Funktion Chr?

oder die Raute

Delphi-Quellcode:
s := 'abc' + Chr(123) + Chr($7B) + #123 + #$7B;
,

wobei die Raute noch mehr hann

Delphi-Quellcode:
s := 'abc'#123#$7B;
.


[edit]
Ohh, wo kommt denn der General plötzlich her :shock:

p80286 5. Aug 2011 13:56

AW: Hex-Werte an String hängen
 
Noch ne Möglichkeit aber vielleicht nicht das was gewünscht war:
Delphi-Quellcode:
procedure TForm1.foo;
var
  Temp:String;
begin
  Temp := 'W' + InttoHex($03,2) + InttoHex($F9,2) + InttoHex($A7,2);
end;
Gruß
K-H

Caleb 5. Aug 2011 14:04

AW: Hex-Werte an String hängen
 
Alles klar, sieht soweit ganz gut aus =)
Ich lese aber eine Zahl über ein Edit-Feld ein ... die unter Umständen größer als 255 sein kann ...

Mit dem IntToHex(Variable,4) kann ich die eingelesene Zahl ja auf feste 16bit klammern, oder nicht?

Und jetzt müsste ich doch bestimmt das Datenwort in 2x8Byte aufteilen ... und dann mit chr() rüberbügeln?
Kann man das so machen?

DeddyH 5. Aug 2011 14:09

AW: Hex-Werte an String hängen
 
Ich habe immer noch nicht ganz verinnerlicht, was Du machen willst. Soll das Zeichen, das dem ASCII-Code der Zahl entspricht, an den String angehangen werden (bei Zahlen > 255 dann eben mehrere)?

Caleb 5. Aug 2011 14:18

AW: Hex-Werte an String hängen
 
User-Eingabe 1 : 1000 //defintiv größer als 256
User-Eingabe 2 : 30 //defintiv kleiner als 256

<User-Ei.1> <User-Ei.2>
= 1000 = 30
--> String für Gerät: 'W' + $03 + $E8 + $48
--> mit chr() 'W' + ^C + è + 0

So damit ich den String senden kann ... weil diese dumme CPort-Komponente nur Strings haben will.
So erschien es mir am plausibelsten ... oder?

DeddyH 5. Aug 2011 14:21

AW: Hex-Werte an String hängen
 
Das wird aber blöde, wenn da zufällig eine 0 umgewandelt wird, da der String danach abgeschnitten wird. Allerdings habe ich gerade auch keine rechte Idee, wie man so etwas dann sicher übermitteln soll.

p80286 5. Aug 2011 14:25

AW: Hex-Werte an String hängen
 
Also, wofür soll das gut sein?
Zunächst gibt der Benutzer einen String ein, der aus Ziffern zusammen gesetzt wird.
Wenn "CPort" nur mit Strings umgehen kann, dann hast du doch alles was Du Brauchst?

Gruß
K-H

Caleb 5. Aug 2011 14:33

AW: Hex-Werte an String hängen
 
Zitat:

Zitat von p80286 (Beitrag 1115280)
Also, wofür soll das gut sein?
Zunächst gibt der Benutzer einen String ein, der aus Ziffern zusammen gesetzt wird.
Wenn "CPort" nur mit Strings umgehen kann, dann hast du doch alles was Du Brauchst?

Gruß
K-H

Weil es das Protokoll so will =/

z.B. so ...
--> [Request(ASCII)]+[16bit-Zahl]+[8bit-Zahl]
--> ['W']+[0x01A9]+[0xFF]

und den 16bit-Wert kann ich leider nicht so einfach ASCII-codieren ...

p80286 5. Aug 2011 16:19

AW: Hex-Werte an String hängen
 
Zitat:

Zitat von Caleb (Beitrag 1115287)
--> ['W']+[0x01A9]+[0xFF]

Das erreichst Du über
Delphi-Quellcode:
s:='[''W'']+[0x'+
   inttohex(strtoint(edit1.text),4)+
   ']+[0x'+
   inttohex(strtoint(edit2.text),2)+
   ']';
Da fehlen naturlich noch ein paar Fehlerprüfungen.....

Gruß
K-H

himitsu 5. Aug 2011 18:56

AW: Hex-Werte an String hängen
 
Nein, ein COM-Port kommt grundstzlich auch mit Steuerzeichen ala #0 und Co. zurecht.

Es kommt eher darauf an, wie der Empfänger die Daten interpretiert/interpretieren kann und wie eventuelle Zwischenschichten/Überträger arbeiten.
Mit diesem Wissen sollte man sich erstmal ein Protokoll überlegen und darüber entscheidet sich dann.

Wenn man nun ein Protokoll vorgegeben oder erstellt hat, dann kann man sich überlegen, wie man dieses nun Programmseitig erfüllt/umsetzt.

Namenloser 5. Aug 2011 18:56

AW: Hex-Werte an String hängen
 
Zitat:

Zitat von DeddyH (Beitrag 1115278)
Das wird aber blöde, wenn da zufällig eine 0 umgewandelt wird, da der String danach abgeschnitten wird.

In Delphi eigentlich nicht, weil Delphi keine 0-terminierten Strings verwendet, sondern ein Längenpräfix. Es gibt allerdings einige String-Funktionen die nicht mehr richtig funktionieren, wenn ein 0-Byte vorkommt.

himitsu 5. Aug 2011 18:58

AW: Hex-Werte an String hängen
 
Zitat:

Zitat von NamenLozer (Beitrag 1115319)
In Delphi eigentlich nicht, weil Delphi keine 0-terminierten Strings verwendet, sondern ein Längenpräfix. Es gibt allerdings einige String-Funktionen die nicht mehr richtig funktionieren, wenn ein 0-Byte vorkommt.

Jupp, einige interne Funktionen nutztn nicht die Längenangabe, sondern arbeiten über PChar und auch die VCL, also speziell die gekapselten Windowskomponenten und vorallem deren APIs arbeiten letztendlich fast alle mit PChar.

Caleb 8. Aug 2011 08:45

AW: Hex-Werte an String hängen
 
Zitat:

Zitat von p80286 (Beitrag 1115306)
Zitat:

Zitat von Caleb (Beitrag 1115287)
--> ['W']+[0x01A9]+[0xFF]

Das erreichst Du über
Delphi-Quellcode:
s:='[''W'']+[0x'+
   inttohex(strtoint(edit1.text),4)+
   ']+[0x'+
   inttohex(strtoint(edit2.text),2)+
   ']';

Habt dank für die zahlreichen Antworten, ABER ich glaub wir verstehen uns immer noch bisschen falsch ...
Bei dieser Variante bekomme ich doch den HEX-Wert ins ASCII formatiert ... und zwar in seiner vollen Länge ...
wenn der Wert den ich per Edit-Feld eingegeben habe einem hexadezimalen von meinetwegen 0x01AC entspricht, dann bekomme
ich mit der Vorgehensweise von oben 4 ganze ASCII-Chars für die 16bit-Zahl und zwei Chars für die 8bit-Zahl ...
ABER um die Zahl darzustellen brauche bzw. darf ich nur zwei Chars bzw. einen verwenden.

Solange beim Konvertieren kein Linefeed und Carriage-Return rauskommt ist es mir völlig egal was aus der seriellen Schnittstelle rauspurzelt.
Und CR bzw. LF kann man ja durch Überprüfung verhindern.

Um das nochmal zu verdeutlichen hab ichs mal bisschen in nem Bild zusammengefasst ...

http://imageshack.us/f/830/36160050.jpg/

Leider steh ich nämlich immer noch aufm Schlauch =/

p80286 8. Aug 2011 10:27

AW: Hex-Werte an String hängen
 
Wenn ich das richtig interpretiere dann willst Du einen Ansichar, ein Word und ein Byte übertragen.
Delphi-Quellcode:
TMyRecord = packed record
             n1: Ansichar;
             n2: Word;
             n3: Byte;
          end;
und die beiden Werte n2 und n3 werden über ein TEdit eingegeben. Also brauchst Du Wahrscheinlich so etwas:
Delphi-Quellcode:
var
  MyRecord : TMyRecord;


Myrecord.N1:='W';
Myrecord.n2:=strtoint(Edit1.text) and $FFFF;
MyRecord.n3:=strtoint(Edit2.text) and $00FF;
Gruß
K-H

v2afrank 8. Aug 2011 10:44

AW: Hex-Werte an String hängen
 
Es geht auch einfacher:
Delphi-Quellcode:
s:='W'+Ansichar(hi(strtoint(Edit1.text)))+Ansichar(lo(strtoint(Edit1.text)))+ansichar((strtoint(Edit2.text)));

Caleb 8. Aug 2011 11:28

AW: Hex-Werte an String hängen
 
AMEN
Danke v2afrank funktioniert wunderbar.
@all responses: Vielen Dank für Eure Geduld.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz