![]() |
HEX nach DWORD umwandeln
Guten Abend,
ich möchte gerne IP Adressen sortieren. In einem anderen Thread hat man mir empfohlen, die IP Adressen erst in einen HEX Wert und dann in einen DWORD umzuwandeln. Den 1. Schritt habe ich.
Delphi-Quellcode:
Beispiel:
procedure Tfrm_main.btn_convertClick(Sender: TObject);
var sl: TStringList; begin sl := Split(edt_ipaddress.Text, '.'); // HEX Wert ermitteln lbl_hex.Caption := IntToHex(StrToInt(sl[0]), 2) + ' ' + IntToHex(StrToInt(sl[1]), 2) + ' ' + IntToHex(StrToInt(sl[2]), 2) + ' ' + IntToHex(StrToInt(sl[3]), 2); // DWORD Wert ermitteln end; Zitat:
Vielen Dank im voraus. Sven |
Re: HEX nach DWORD umwandeln
Wenn du es schon "binär" hast, also in den Integern, warum erst wieder in einen Text umandeln?
hier kannst du es den Bytes zuweisen und als LongWord (DWORD) auslesen
Delphi-Quellcode:
oder etwas Mathe
Type
TIP = Record Case Integer of 0: (B: Array[0..3] of Byte); 1: (L: LongWord); End; * bzw. SHL |
Re: HEX nach DWORD umwandeln
Sorry aber das verstehe ich jetzt nicht.
Also wenn ich meine IP Adresse zerlege bzw. die Punkte entferne und dann nur mit der Integer Zahl sortiere, ist Ergebnis falsch. Denn 192.168.2 würde nach 192.168.100 kommen, oder? Die Umsetzung bezieht sich auf einen anderen Thread in dem mir die Vorgehensweise empfohlen wurde. Wenn es eine bessere gibt, würde ich sie auch nehmen. Aber trotzdem würde mich interessieren wie aus einem HEX Wert ein DWORD wird. Danke im voraus. Sven |
Re: HEX nach DWORD umwandeln
Moin moin,
Zitat:
vorgeschlagen, die einzelnen Bytes der IP Adresse in einen DWord zu schreiben und dann zu sortieren. (Warum der Umweg über String, Hex und dann wieder in einen Integer? Meistens liegen die IP-Adressen sowieso als DWORD bzw. ByteArray vor - dann könnte man gleich sortieren, aber das nur am Rande) Hier mal ein Beispielcode, der auch das HEX in DWORD zeigt. Dabei dürfte deutlich werden, das die Umwandlung in einen HEX(String) überflüssig ist.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Type TIP = Record Case Integer of 0: (B: Array[0..3] of Byte); 1: (L: LongWord); End; var dw:dword; d2:tip; begin // Deine Hexwerte in einen DWORD schreiben dw := $00000000; //$00.00.00.00 dw := dw or ($C0 shl 24); //$C0.00.00.00 oder auch dw := dw or (192 shl 24); dw := dw or ($A8 shl 16); //$C0.A8.00.00 oder auch dw := dw or (168 shl 16); dw := dw or ($01 shl 8); //$C0.A8.01.00 oder auch dw := dw or (1 shl 8); dw := dw or $1D; //$C0.A8.01.1D oder auch dw := dw or 29; // Methode meines Vorschreibers - hierbei aber auf die Umgedrehte Reihenfolge achten d2.B[0]:= 29; // oder auch d2.B[0]:= $1D; d2.B[1]:= 1; // oder auch d2.B[1]:= $01; d2.B[2]:= 168; // oder auch d2.B[2]:= $A8; d2.B[3]:= 192; // oder auch d2.B[3]:= $C0; showmessage(inttostr(dw)+#13#10+ inttostr(d2.L)); end; |
Re: HEX nach DWORD umwandeln
Zitat:
Delphi-Quellcode:
i:=StrToInt('$C0A8011D');
![]() |
Re: HEX nach DWORD umwandeln
So, ich habe es jetzt mal umgesetzt.
Delphi-Quellcode:
Beispiel
procedure Tfrm_main.btn_convertClick(Sender: TObject);
var sl: TStringList; i : Integer; begin sl := Split(edt_ipaddress.Text, '.'); // HEX Wert ermitteln lbl_hex.Caption := '$' + IntToHex(StrToInt(sl[0]), 2) + IntToHex(StrToInt(sl[1]), 2) + IntToHex(StrToInt(sl[2]), 2) + IntToHex(StrToInt(sl[3]), 2); i:= StrToInt(lbl_hex.Caption); // DWORD Wert ermitteln lbl_dword.Caption := IntToStr(i); end;
Code:
Warum kommt da ein Minus?
192.168.1.2 -> -> $c0a80102 -> -1062731518
In diesem Thread kommt bei generic ein anderer Wert heraus, warum? ![]() |
Re: HEX nach DWORD umwandeln
Weil das 31. Bit belegt ist $C und dieses steht quasi im Integer für negative Werte.
|
Re: HEX nach DWORD umwandeln
Moin moin,
Zitat:
Das hier sollte dir den Unterschied klarmachen:
Delphi-Quellcode:
var
dw:dword; i:integer; begin dw := $c0a80102; i := dw; ShowMessage('DWORD: ' + inttostr(dw)+#13#10+'Integer: ' + inttostr(i)); |
Re: HEX nach DWORD umwandeln
Vielen Dank. Jetzt habe ich es verstanden.
Gruß, Sven |
Re: HEX nach DWORD umwandeln
Stimmt meine Variable mit "i" war nicht so geschickt gewählt.
Also Cardinal oder DWord nutzen. DWord würde ich hier bevorzugen. Der Cardinal wird doch bestimmt mal 64Bit. Ich habe dort zur Vollständigkeit auf die letzte Frage noch geantwortet: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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