![]() |
HEX-string (Zweierkomplement) in Dezimal-string wandeln
... und umgekehrt.
Delphi-Quellcode:
... funktioniert bei der Darstellung im Zweierkomplement nicht
var sHex: string;
iDez: integer; begin sHex:='$93E0'; iDez:=StrToInt(sHex); end; weil z.B. $93E0 = -27680 ergibt. Mein Gedanke, den String in eine Binärzahl wandeln, das Highbit rausziehen, Vorzeichen auswerten, invertieren und einen Einser addieren und dann wieder wandeln. Hat das vielleicht schon jemand mal umgesetzt oder bin ich auf der falschen Fährte? |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Deklariere iDez mal als SmallInt...
Gruß Hawkeye |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Bei mir funktioniert das :
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var sHex: string; iDez: integer; begin sHex:='$93E0'; iDez:=StrToint(sHex); showmessage(inttostr(iDez)); // ergibt 37856 end; |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Wenn man statt Integer einen vorzeichenlosen Typen (Word oder Cardinal) nimmt, dann gibt es auch keine Probleme.
Grüße vom marabu |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Mit seinem Quelltext erhält er bereits ein positives Ergebnis (getestet mit Delphi 2006).
Ich denke, daß er ein negatives Ergebnis erwartet. Gruß Hawkeye |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Hallo Hawkeye,
ich hatte die Frage so verstanden, dass aufgrund des gesetzten Highbit im HexString und die Verwendung von Integer (in D1 oder durch Typverbiegung 16bit) fälschlicherweise ein negativer Wert geliefert wird. Egal, wie es gemeint war, jetzt liegen ja alle eventuellen Lösungen vor... marabu |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Ich erwarte ein negatives Ergebnis.
@chrisw $93E0 ergibt nicht 37856 sonder in der Zweierkomplement-Darstellung -27680 !!! @Hawkeye219 Vom Wertebereich würde es passen. SmallInt 16Bit mit Vorzeichen von +32767/-32768 Ich probier mal den Vorschlag von @marabu |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Delphi-Quellcode:
... haut nicht hin.
var sHex: string;
iDez: smallint; begin sHex:='$93E0'; iDez:=StrToInt(sHex); ShowMessage(IntToStr(iDez)); end; Meldung: Konstantenausdruck verletzt untere Grenze Wenn ich iDEZ als longint deklariere bekomm ich wieder den falschen Wert 37856 ?!? |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Hmmm.... Delphi arbeitet doch mit dem Einerkomplement oder?
Wenn ich nun einen HEX-String habe von dem ich weiss das er eine Darstellung im Zweierkomplement ist muss ich das doch umrechnen:
Delphi-Quellcode:
procedure TDemoForm.Button1Click(Sender: TObject);
var sHex: string; iDez: integer; neg : boolean; begin sHex := '$93E0'; iDez := StrToint(sHex); neg := (iDez AND $8000) = $8000; dec(iDez); iDez := iDez XOR $FFFF; if (neg) then iDez := iDEZ * -1; showmessage(inttostr(iDez)); // ergibt 37856 end; |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
@Sharky
Das war auch mein Gedanke, Danke für die Bestätigung. Dein Code funktioniert richtig
Delphi-Quellcode:
Hast du vielleicht auch noch gleich eine Lösung für den umgekehrten Weg,
showmessage(inttostr(iDez)); // ergibt -27680
von Dezimal nach Hex im Zweierkomplement? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 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