AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

HEX nach DWORD umwandeln

Ein Thema von Piro · begonnen am 8. Dez 2009 · letzter Beitrag vom 9. Dez 2009
Antwort Antwort
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

HEX nach DWORD umwandeln

  Alt 8. Dez 2009, 23:44
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

Re: HEX nach DWORD umwandeln

  Alt 8. Dez 2009, 23:55
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#3

Re: HEX nach DWORD umwandeln

  Alt 9. Dez 2009, 00:09
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
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#4

Re: HEX nach DWORD umwandeln

  Alt 9. Dez 2009, 01:24
Moin moin,
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;
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#5

Re: HEX nach DWORD umwandeln

  Alt 9. Dez 2009, 02:11
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.
i:=StrToInt('$C0A8011D'); http://docs.embarcadero.com/products..._StrToInt.html
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#6

Re: HEX nach DWORD umwandeln

  Alt 9. Dez 2009, 09:14
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#7

Re: HEX nach DWORD umwandeln

  Alt 9. Dez 2009, 09:28
Weil das 31. Bit belegt ist $C und dieses steht quasi im Integer für negative Werte.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#8

Re: HEX nach DWORD umwandeln

  Alt 9. Dez 2009, 10:30
Moin moin,
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));
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#9

Re: HEX nach DWORD umwandeln

  Alt 9. Dez 2009, 11:10
Vielen Dank. Jetzt habe ich es verstanden.

Gruß, Sven
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#10

Re: HEX nach DWORD umwandeln

  Alt 9. Dez 2009, 14:44
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
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 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