Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi HEX nach DWORD umwandeln (https://www.delphipraxis.net/144478-hex-nach-dword-umwandeln.html)

Piro 8. Dez 2009 22:44


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:
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;
Beispiel:
Zitat:

IP Adresse: 192.168.1.29
HEX Wert: C0 A8 01 1D
Leider habe ich keinen Plan wie man jetzt aus einem HEX Wert ein DWORD macht. Kann mir vielleicht einer auf die Sprünge helfen?
Vielen Dank im voraus.

Sven

himitsu 8. Dez 2009 22:55

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:
Type
  TIP = Record
    Case Integer of
      0: (B: Array[0..3] of Byte);
      1: (L: LongWord);
  End;
oder etwas Mathe
* bzw. SHL

Piro 8. Dez 2009 23:09

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

x000x 9. Dez 2009 00:24

Re: HEX nach DWORD umwandeln
 
Moin moin,
Zitat:

Zitat von daywalker299
...
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?
...

Weil die 2 in deiner IP (192.168.2) ja eigentlich eine 002 ist und deswegen wurde dir vermutlich
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;

generic 9. Dez 2009 01:11

Re: HEX nach DWORD umwandeln
 
Zitat:

Zitat von daywalker299
Beispiel:
Zitat:

IP Adresse: 192.168.1.29
HEX Wert: C0 A8 01 1D
Leider habe ich keinen Plan wie man jetzt aus einem HEX Wert ein DWORD macht.

Delphi-Quellcode:
i:=StrToInt('$C0A8011D');
http://docs.embarcadero.com/products..._StrToInt.html

Piro 9. Dez 2009 08:14

Re: HEX nach DWORD umwandeln
 
So, ich habe es jetzt mal umgesetzt.

Delphi-Quellcode:
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;
Beispiel
Code:
192.168.1.2 -> -> $c0a80102 -> -1062731518
Warum kommt da ein Minus?

In diesem Thread kommt bei generic ein anderer Wert heraus, warum?
VirtualStringTree: IP Adressen sortieren

himitsu 9. Dez 2009 08:28

Re: HEX nach DWORD umwandeln
 
Weil das 31. Bit belegt ist $C und dieses steht quasi im Integer für negative Werte.

x000x 9. Dez 2009 09:30

Re: HEX nach DWORD umwandeln
 
Moin moin,
Zitat:

Zitat von daywalker299
...
In diesem Thread kommt bei generic ein anderer Wert heraus, warum?
VirtualStringTree: IP Adressen sortieren

weil generic dort wohl den wert nicht einer Integer Variablen zugewiesen hat, sondern einer DWORD Variablen.

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));

Piro 9. Dez 2009 10:10

Re: HEX nach DWORD umwandeln
 
Vielen Dank. Jetzt habe ich es verstanden.

Gruß, Sven

generic 9. Dez 2009 13:44

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:
http://www.delphipraxis.net/internal...109026#1109026


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