![]() |
Negative HEX-Werte übertragen
Hallo zusammen,
irgendwie wollen die grauen Zellen nicht (mehr) so recht. :wall: Via ![]()
Delphi-Quellcode:
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:
var Zahl: SmallInt;
begin ApdCOMPort.PutString(Chr(HiWord(Zahl)) + Chr(LoWord(Zahl)); end;
Delphi-Quellcode:
Das funktioniert nun auch mit negativen Zahlen, ABER:
var Zahl: SmallInt;
begin if (Zahl < 0) then Zahl:= Zahl + $FFFFFFFFFFFFFFFF + 1; ApdCOMPort.PutString(Chr(HiWord(Zahl)) + Chr(LoWord(Zahl)); end; Das geht nur gut, so lange die Zahl -256 nicht unterschreitet. Daher dachte ich mir:
Delphi-Quellcode:
Aber weder ein '+' noch ein '-' hinter der 1 bringt das gewünschte Ergebnis.
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; 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? |
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! |
Re: Negative HEX-Werte übertragen
Zitat:
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:
mit
function HexToInt(HexNum: string): LongInt;
begin Result:=StrToInt('$' + HexNum); end; value:= HexToInt('FED4'); liefert brav -300. Das Pendant IntToHex() liefert bei -300 FFFFFFED4 und das ist irgendwie doof. :roll: |
Re: Negative HEX-Werte übertragen
Zitat:
|
Re: Negative HEX-Werte übertragen
Zitat:
Gruß, Carsten |
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; |
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:
ist.
var
zahl:smallint; //16Bit Ausserdem ist Dein Hi/Lo-Problem mit erschlagen. Irgendwie bezweifele ich, daß chr(hi(zahl)) einen Hexwert ergibt. Gruß |
Re: Negative HEX-Werte übertragen
Zitat:
Zitat:
|
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 |
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