Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Zitat:
Ergo müsste es so sein:
Delphi-Quellcode:
Das ganze kann/sollte man natürlich noch etwas opimieren. Ich wollte nur die einzelnen schritte zeigen.
procedure TDemoForm.Button2Click(Sender: TObject);
var sHex: string; iDez: integer; neg : boolean; begin iDez := -27680; neg := iDez < 0; if (neg) then iDez := iDez * -1; // In Betrag wandeln iDez := iDez XOR $FFFF; // Invertieren INC(iDez); // Um 1 erhöhen. sHex := IntToHex(iDez,4); showmessage(sHex); end; |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Vielen Dank - funktioniert perfekt
|
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
@Sharky
Delphi arbeitet mit dem Zweierkomplement:
Delphi-Quellcode:
Laut Wikipedia wird das Einerkomplement bei der Ganzzahlarithmetik nicht verwendet, weil es einige Nachteile mit sich bringt. Unter anderem gibt es für die Null zwei Binärdarstellungen.
+1 = 0000...0001
-1 = 1111...1111 @MarLe Die Fehlermeldung konnte ich mit eingeschalteter Bereichsprüfung nachvollziehen. Seltsamerweise tritt der Fehler nicht auf, wenn man statt StrToInt() die Prozedur Val() verwendet. Das Ergebnis ist auch in diesem Fall korrekt. |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Das ganze funktioniert auch nicht richtig wenn ich den Hex-Wert
über ein Eingabefeld (TEdit) übergebe:
Delphi-Quellcode:
Sorry, funktioniert schon, aber nur bei negativen Werten (siehe nächsten Beitrag)
sHex := '$93E0'; // ergibt -27680
sHex := EditsHex.Text; // eine Eingabe von $93E0 ergibt 37856 ?!? |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Die Funktionen rechnen nur bei negativen Werten richtig.
Delphi-Quellcode:
Ich denke mal ich muss bei Hex2Dec vorher das Highbit (0 oder 1) auswerten.
Hex2Dec:
$55C8 -> 43576 falsch $007F -> 65409 falsch $0001 -> 65535 falsch $FFFF -> -1 richtig $FFF0 -> -16 richtig Dec2Hex: +21960 -> $AA2F falsch +127 -> $FF81 falsch +1 -> $FFFF falsch -1 -> $FFFF richtig -16 -> $FFF0 richtig korrekte Werte wären: $55C8 <-> +21960 $007F <-> +127 $0001 <-> +1 $FFFF <-> -1 $FFF0 <-> -16 Bei Dec2Hex das Vorzeichen, oder??? |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Versuch's mal damit:
Delphi-Quellcode:
Die Routinen liefern/erwarten 4-stellige Hexwerte und führen keine Fehlerüberprüfung durch.
function Dec2Hex (aValue: integer): string;
begin Result := IntToHex(LoWord(aValue), 4); end; function Hex2Dec (const aValue: string): Integer; var code : Integer; temp : SmallInt; begin Val (aValue, temp, code); Result := temp; end; Gruß Hawkeye |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Vielen Dank, funktioniert.
Wie haut das bei 2- bzw. 8 stelligen Hex-Werten hin. Hängt das Ergebnis der Funktion val() von der Deklaration der Variablen ab? (SmallInt, ShortInt bzw. LongInt) |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Ja, scheint so zu sein.
Bei Dec2Hex nimmst Du dann Lo() für 2-stellige Hexwerte. Gruß Hawkeye |
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Hätte ich jetzt auch gedacht. Aber
Delphi-Quellcode:
liefert bei -40 $FFD8
Result := IntToHex(LoWord(aValue), 2);
|
Re: HEX-string (Zweierkomplement) in Dezimal-string wandeln
Lo(), nicht LoWord() :zwinker:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 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