Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Negative HEX-Werte übertragen (https://www.delphipraxis.net/130728-negative-hex-werte-uebertragen.html)

Carsten1234 12. Mär 2009 08:43


Negative HEX-Werte übertragen
 
Hallo zusammen,

irgendwie wollen die grauen Zellen nicht (mehr) so recht. :wall:

Via ApdCOMPort sollen Hex-Daten im Format Hi/Lo übertragen werden. Um dies zu realisieren, wird eine Zahl via HiWord/LoWord zerlegt und mittels Chr und ApdCOMPort.PutString abgeschickt.
Delphi-Quellcode:
var Zahl: SmallInt;
begin
  ApdCOMPort.PutString(Chr(HiWord(Zahl)) + Chr(LoWord(Zahl));
end;
Funktioniert auch wunderprächtig, so lange die Zahl > -1 ist. Um dies zu beheben, setzte ich bewusst einen Breichsüberlauf ein, das ganze sieht dann so aus:
Delphi-Quellcode:
var Zahl: SmallInt;
begin
  if (Zahl < 0) then
    Zahl:= Zahl + $FFFFFFFFFFFFFFFF + 1;
  ApdCOMPort.PutString(Chr(HiWord(Zahl)) + Chr(LoWord(Zahl));
end;
Das funktioniert nun auch mit negativen Zahlen, ABER:
Das geht nur gut, so lange die Zahl -256 nicht unterschreitet.
Daher dachte ich mir:
Delphi-Quellcode:
var Zahl: SmallInt;
begin
  if (Zahl < 0) then
    Zahl:= Zahl + $FFFFFFFFFFFFFFFF + 1 + (((Abs(Min)-1) div 256) * 256);
  ApdCOMPort.PutString(Chr(HiWord(Zahl)) + Chr(LoWord(Zahl));
end;
Aber weder ein '+' noch ein '-' hinter der 1 bringt das gewünschte Ergebnis.
Sowohl bei einem '+' als auch bei einem '-' kommt (z.B.) bei einer -300 eine -44 im Gerät an. :gruebel:

Wo ist der Denkfehler?

Dank vorab und Gruß, Carsten

Mist, falsches Unterforum. Kann man den Beitrag irgendwie verschieben?

himitsu 12. Mär 2009 08:53

Re: Negative HEX-Werte übertragen
 
blos mal 'ne Frage...

SmallInt = 2 Byte

$FFFFFFFFFFFFFFFF+1 = 8 Byte (Int64)

auf 'nen Int64 macht diese Rechnung garnichts, da das zuaddierte Bit an 64.-ter Stelle nicht in Int64 reinpaßt ... aus SmallInt isses schon lange raus ....
praktisch gesehn passier da nix.

und du solltest schauen wo der Fehler liegt ... mit solchen Rechnungen verschiebst du nur das Problem an eine andere Stelle, aber es ist immernoch da!

Carsten1234 12. Mär 2009 09:26

Re: Negative HEX-Werte übertragen
 
Zitat:

Zitat von himitsu
und du solltest schauen wo der Fehler liegt ... mit solchen Rechnungen verschiebst du nur das Problem an eine andere Stelle, aber es ist immernoch da!

Ich sag ja nicht, dass meine Lösung der Weisheit letzter Schluss ist. Für alternative Lösungen bin ich frei. :stupid:
Wenn ich im Gerät händisch einen Wert von -300 eingebe und diesen Wert via Prg. auslese, erhalte ich im Hi/Lo-Format die
Werte
Dez.: 254; 212
Hex : FE D4

Ein
Delphi-Quellcode:
function HexToInt(HexNum: string): LongInt;
begin
  Result:=StrToInt('$' + HexNum);
end;
mit
value:= HexToInt('FED4');
liefert brav -300.

Das Pendant IntToHex() liefert bei -300 FFFFFFED4 und das ist irgendwie doof. :roll:

jfheins 12. Mär 2009 09:33

Re: Negative HEX-Werte übertragen
 
Zitat:

Zitat von Carsten1234
Ein
Delphi-Quellcode:
function HexToInt(HexNum: string): LongInt;
begin
  Result:=StrToInt('$' + HexNum);
end;
mit
value:= HexToInt('FED4');
liefert brav -300.

Das Pendant IntToHex() liefert bei -300 FFFFFFED4 und das ist irgendwie doof. :roll:

Einfach die ersten vier Stellen abschneiden, dann machst du aus dem int einen Smallint. Beachte jedoch den Wertebereich/eventuelle Über/Unterläufe.

Carsten1234 12. Mär 2009 11:01

Re: Negative HEX-Werte übertragen
 
Zitat:

Zitat von jfheins
Einfach die ersten vier Stellen abschneiden, dann machst du aus dem int einen Smallint. Beachte jedoch den Wertebereich/eventuelle Über/Unterläufe.

Mache ich jetzt auch einfach und caste vorher auf Smallint.

Gruß, Carsten

himitsu 12. Mär 2009 11:07

Re: Negative HEX-Werte übertragen
 
Entweder von StrToInt(Integer) nach SmallInt casten


oder eventuell +32768 rechnen, also das Ganze in den positiven Bereich verschieben (dabei wird das positive aber Negativ).

+32768 = -Low(SmallInt)

Delphi-Quellcode:
var Zahl: SmallInt;
begin
  Inc(Zahl, 32768);
  ApdCOMPort.PutString(Chr(HiWord(Zahl)) + Chr(LoWord(Zahl));




function HexToInt(HexNum: string): SmallInt;
begin
  Result:=StrToInt('$' + HexNum);
end;

// bzw.

function HexToInt(HexNum: string): Integer;
begin
  Result:=StrToInt('$' + HexNum) - 32768;
end;

p80286 12. Mär 2009 11:18

Re: Negative HEX-Werte übertragen
 
Hallo Carsten1234,

InttoHex(zahl,4) liefert bei -5 FFFFFFFB und bei 5 0005. Da hat wohl jemand etwas geschlampt. Für Dich heißt das einfach, die ersten 4 Buchstaben zu löschen wenn Dein String länger als 4 ist.
Oder Du arbeitest mit InttoHex(zahl,8) dan haben positive und negative Werte das gleiche Format. Auch wenn
Delphi-Quellcode:
var
  zahl:smallint; //16Bit
ist.

Ausserdem ist Dein Hi/Lo-Problem mit erschlagen.

Irgendwie bezweifele ich, daß chr(hi(zahl)) einen Hexwert ergibt.

Gruß

guidok 12. Mär 2009 12:49

Re: Negative HEX-Werte übertragen
 
Zitat:

Zitat von p80286
Hallo Carsten1234,

InttoHex(zahl,4) liefert bei -5 FFFFFFFB und bei 5 0005. Da hat wohl jemand etwas geschlampt.

Das entspricht genau dem, was die Delphi Hilfe zu IntToHex sagt:

Zitat:

Mit dem Parameter Digits kann festgelegt werden, wie viele Hexadezimalstellen mindestens zurückgegeben werden.
Auch wenn da acht Stellen zurück kommen, sind das auf jeden Fall mehr, als mindestens vier.

p80286 12. Mär 2009 16:39

Re: Negative HEX-Werte übertragen
 
OK formal ganz richtig,

aber wenn ich einen 16Bit-Wert hineinstopfe dann erwarte ich keine Ausgabe für einen 32Bit-Wert. Dann muß mir erst einmal einfallen, daß intern mit 32Bit gearbeitet wird.

Gruß
K-H

Satty67 12. Mär 2009 17:04

Re: Negative HEX-Werte übertragen
 
Mal was probiert
Delphi-Quellcode:
var
  HexStr : String;
  Zahl : SmallInt;
begin
  Zahl := -200;

  // Zahl wandeln
  HexStr := IntToHex(Hi(Zahl),2) + IntToHex(Lo(Zahl),2);

  // HexStr jetzt 4 Zeichen langer Hexcode
  Edit1.Text := HexStr;

  // Zurück Wandeln, kommt auch tatsächlich -200 raus
  Edit2.Text := IntToStr( SmallInt(StrToInt('$'+HexStr)));


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 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