Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Typenumwandlungen (https://www.delphipraxis.net/116167-typenumwandlungen.html)

endeffects 24. Jun 2008 16:25


Typenumwandlungen
 
Hallo,

ich hab ein Problem mit der Umwandlung von Typen.
Und zwar möchte ich den Wert 0x4FDD2F96 umwandeln
in 1339895702. D.h. irgendwie muss ich den Hexwert
in einen String umwandeln und dann aus jedem Zeichen
des Strings einen Integerwert bilden.

Ich hab es schon wie folgt probiert:

Delphi-Quellcode:
showmessage(IntToStr(Ord((Chr(StrToInt('$4F'))))));
Aber dann erhalte ich den Wert 79 und nicht 13 oder 133 ?!

Welche Umwandlung hier von nöten ist ist mir ehrlich gesagt
völlig schleierhaft.

Hat Jemand vielleicht einen Rat?

Mfg

1234588 24. Jun 2008 16:29

Re: Typenumwandlungen
 
Delphi-Quellcode:
LongInt($4FDD2F96)
:o)

Phoenix 24. Jun 2008 16:30

Re: Typenumwandlungen
 
Ist das was für Dich? http://www.delphipraxis.net/internal...?p=27809#27809

Ps: Das war ganz einfach gesucht nach Hier im Forum suchenHexToInt

Sherlock 24. Jun 2008 16:37

Re: Typenumwandlungen
 
Lustigerweise gibt es ein IntToHex in Delphi, aber kein HexToInt.

Das hab ich mal selber geschrieben (ist aber auch trivial):
Delphi-Quellcode:
function HexToInt(HexNum: string): LongInt;
begin
  if HexNum = '' then
    Result := 0
  else
  begin
    if Pos('$', HexNum) < 1 then
      Result := StrToInt('$' + HexNum)
    else
      Result := StrToInt(HexNum);
  end;
end;
Edit: Dank rotem Kasten eigentlich fast überflüssig...

Sherlock

endeffects 24. Jun 2008 16:43

Re: Typenumwandlungen
 
oh vielen dank für die zahlreichen und schnellen antworten.
die methode mit dem longint() funktioniert wunderbar
solange ich den hex wert eingebe, aber wie löse ich das
wenn ich anstelle des hex wertes einen normalen string habe?

Phoenix 24. Jun 2008 16:46

Re: Typenumwandlungen
 
Häh?

Genau das steht doch in dem von mir verlinkten Beitrag und der letzten Antwort von Sherlock drin??

endeffects 24. Jun 2008 16:57

Re: Typenumwandlungen
 
nein ich meine wenn ich keinen hex wert habe sondern lediglich einen string:

Delphi-Quellcode:
var s: String;
begin
showmessage(IntToStr(LongInt($4FDD2F96)));  //>> 1339895702

s:= Chr(StrToInt('$4F')) + Chr(StrToInt('$DD')) + Chr(StrToInt('$2F')) + Chr(StrToInt('$96'));
showmessage(s);
Wie bekomm ich denn jetzt aus dem string s den wert 1339895702 errechnet?

gammatester 24. Jun 2008 17:00

Re: Typenumwandlungen
 
Zitat:

Zitat von Phoenix
Häh?

Genau das steht doch in dem von mir verlinkten Beitrag und der letzten Antwort von Sherlock drin??


Naja, genau steht's ja nun nicht drin, da er von einer C-Hexzahl mit 0x... ausgeht und da fährt die HexToInt-Funktion gegen diw Wand. Aber die Richtung sollte klar sein.

Gruß Gammatester

Cyf 24. Jun 2008 17:01

Re: Typenumwandlungen
 
Delphi-Quellcode:
StrToInt('$4FDD2F96');
:thumb:

Oder was meinst du? :gruebel:

[Edit]
Zitat:

von einer C-Hexzahl mit 0x...
In dem Fall, muss der Strin natürlich erst entsprechend formatiert werden, aber das '0x' gegen ein '$' auzutauschen, sollte zu schaffen sein.

gammatester 24. Jun 2008 17:09

Re: Typenumwandlungen
 
Zitat:

Zitat von Cyf
In dem Fall, muss der Strin natürlich erst entsprechend formatiert werden, aber das '0x' gegen ein '$' auzutauschen, sollte zu schaffen sein.

Sag ich ja :)
Gammatester

RavenIV 24. Jun 2008 17:10

Re: Typenumwandlungen
 
Aus der Deplhi-Hilfe zu StrToInt:
Zitat:

...
...
Beschreibung
StrToInt konvertiert den in S angegebenen String in einen Integer-Wert. S muss die Entsprechung eines ganzzahligen Wertes (dezimal oder hexadezimal) sein. Enhält er keinen gültigen Wert, wird eine EConvertError-Exception ausgelöst.

endeffects 24. Jun 2008 17:13

Re: Typenumwandlungen
 
ja entschuldigung, vielleicht drück ich mich auch etwas schwerfällig aus :D

also ich möcht eine antwort von einem udp server auswerten und reagieren,
in der dokumentation heißt es wie folgt:

Zitat:

The master servers each respond by sending FF FF FF FF 73 0A followed by a (relatively) unique 4-byte "challenge" number.
aus dem string den mir der server sendet extrahiere ich also die letzten 4 zeichen.
weiter gehts dann mit:

Zitat:

The challenge number, 1339895702 (0x4FDD2F96) in this example, is the reverse of the challenge number originally sent by the server (96 2F DD 4F).
das heißt also das ich den string den ich erhalten habe umdrehen muss:

Delphi-Quellcode:
CallengeCode:= CallengeCode[4] + CallengeCode[3] + CallengeCode[2] + CallengeCode[1];
soweit eigentlich ganz simpel, nun habe ich aber das problem aus diesem 4 zeichen
langen string diese komische challenge nummer zu formen

Phoenix 24. Jun 2008 17:22

Re: Typenumwandlungen
 
Ouch.. du hast eigentlich keinen String, sondern ein Array of Byte, das ist Dein eigentliches Problem (und dürfte Dir zudem massiv Probleme bereiten, sobald Delphi 2008 mit Unicode daherkommt).

Und wenn Du die letzten vier Bytes umgedreht hast, dann hast Du schon genau die Werte, die Du zurücksenden musst. Da brauchst Du nichts mehr konvertieren.

endeffects 24. Jun 2008 17:24

Re: Typenumwandlungen
 
der server möchte aber diese challange nummer als string haben,
es reicht leider nicht einfach die bytes umzudrehen und zurückzusenden

Cyf 24. Jun 2008 17:25

Re: Typenumwandlungen
 
Dein String muss 9 (8 + '$' bzw, bei '0x' 10) Zeichen lang sein, da es in deinem Beispiel um eine 4-Byte Zahl geht und ein Hexadezimalzeichen 4 Bit (0,5 Byte) repräsentiert, in deinem Beispiel sind es auch 8 Hexadezimalzeichen.

[Edit] Wenn ich das richtig verstehe:

Delphi-Quellcode:
function foobar(s: string): Integer;
begin
  Result:= StrToInt('$' + s[8] + s[9] + s[6] + s[7] + s[4] + s[5] + s[2] + s[3]);
end;
Das ganze ausgehend davon das s[0], das erste Zeichen ist bin bei string grad nicht mehr sicher, ob das nicht doch bei s[1] anfängt, dann einfach überall beim Index eins drauf. (ach es leben wunderschöne #0-terminierte char-arrays)

Phoenix 24. Jun 2008 17:29

Re: Typenumwandlungen
 
In dem Fall ist wohl IntToHex(byte1, 2) + IntToHex(byte2, 2) + IntToHex(byte3, 2) + IntToHex(byte4, 2) das richtige.
Oder, Du packst die Werte zuvor in einen einzigen Wert - also gleich beim auseinanderpflücken, IntToHex(byte1 + byte2*256 + byte3*65536 + byte4*16777216, 8 )

endeffects 24. Jun 2008 17:36

Re: Typenumwandlungen
 
nun hab ich leider irgendwie den anschluss verloren,
ich hatte ja gehofft das es recht einfach möglich ist
diesen 4 byte string so umzuwandeln das ich über StrToInt($...)
irgendwie an diesen wert komme

endeffects 24. Jun 2008 18:02

Re: Typenumwandlungen
 
so nun hab ich es doch tatsächlich noch hinbekommen:

Delphi-Quellcode:
function StringtoHex(Data: string): string;
var
  i, i2: Integer;
  s: string;
begin
  i2 := 1;
  for i := 1 to Length(Data) do
  begin
    Inc(i2);
    if i2 = 2 then
    begin
      i2 := 1;
    end;
    s := s + IntToHex(Ord(Data[i]), 2);
  end;
  Result := '$' + s;
end;

CallengeCode:= CallengeCode[4] + CallengeCode[3] + CallengeCode[2] + CallengeCode[1];
CallengeCode:= StringtoHex(CallengeCode);
CallengeCode:= IntToStr(LongInt(StrToInt(CallengeCode)));
vielen vielen lieben dank für eure hilfe und geduld =)
:hello: :hello: :hello: :hello:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz