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 -> Integer (https://www.delphipraxis.net/36047-hex-integer.html)

Pseudemys Nelsoni 15. Dez 2004 01:42


Hex -> Integer
 
hi

ich lese mit socket.receivebuf(...) die ersten 2 bytes eines packets, diese 2 bytes geben die länge des gesamten packetes an... so wenn ich diese 2bytes nun in einem array[0..1] of byte habe, wie bekomme ich das array nun in einen integer umgewandelt (wie gesagt er gibt die grösse des packetes an)

?

dizzy 15. Dez 2004 02:13

Re: Hex -> Integer
 
1) Aus 2 Bytes bekommst du aller bestens einen WORD (0..65535) ;)

2) Müsstest du wissen, in welcher Reihenfolge die Bytes kommen - also ob höherwertiges oder niederwertiges zu erst.
mal eine Umwandlung für den Fall dass das niederwertige Byte im Array an Index 0 steht:
Delphi-Quellcode:
var
  Wert: Word;
begin
  Wert := Word(arr[0] or (arr[1] shl 8));

  // Alternativ, aber langsamer/unschöner/arithmetischer :) :
  Wert := arr[0] + arr[1]*256;
end;
Falls die Bytes anders herum im Array stehen, einfach die Indezes vertauschen.

Nachti,
Fabian

Pseudemys Nelsoni 15. Dez 2004 02:39

Re: Hex -> Integer
 
hallo fabian,

danke für deine antwort.

kannst du mir noch sagen wie genau das hier funktioniert?

Zitat:

Word(arr[0] or arr[1] shl 8));

ich versteh rechnungen derart nie :(

[edit=Luckie]Smily-Code deaktiviert. Mfg, Luckie[/edit]

Luckie 15. Dez 2004 03:49

Re: Hex -> Integer
 
Machen wir es mal im Binärsystem:
Code:
4 : 2 = 2 (d)
100 : 010 = 010 (b)

8 : 2 = 4 (d)
1000 : 0010 = 0100 (b)
Was fällt auf? Teilt man im Binärsystem durch 2, entspricht dies eine Bit-Verschiebung um eine Stelle nach rechts. Aus 100 wird 010. Umgekehrt kann man daraus folgern, dass eine Bit-Verschiebung um eins nach links einer Multiplikation mit 2 (2^1) entspricht. Eine Bit-Verschiebung um 2 entspricht dann einer Multiplikation mit 4 (2^2). Eine Bit-Verschiebung um 3 entspricht einer Multiplikation mit 8. Die Bit-Verschiebung um 8 entspricht also einer Multiplikation mit 256 (2^8).

Beispiel:
4 shl 8 = 1024
4 * 2^8 = 4 * 256 = 1024

dizzy hat also nichts anderes gemacht als einen Wert mit 2^8 zu multiplizieren. Bzw. wenn man sich den ganzen Ausdruck anguckt:
Delphi-Quellcode:
Word(arr[0] or arr[1] shl 8)
hat er einen Wert mit 2^8 multipliziert und ihn mit einen anderen mit einem logischem oder verknüpft.
Code:
010 or (010 shl 1)
010 or 100

   010
or 100
------
   110
entspricht:
Code:
2 + 2 * 2^1 
2 + 4 = 6

Diese Schiebebefehle sind wesentlich schneller für die CPU durchzuführen als herkömmliche Multiplikationen. Auf dem 386er waren sie bis zu 40x schneller. Wenn man also mit einer Potenz von 2 Multiplizieren will, dann ist es sehr performant mit den Schiebebefehlen zu arbeiten.

Ein bißchen was zum Rumprobieren:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  lo, // left operand
  so, // shift operand
  res: Integer; // Result
begin
  lo := $4;
  so := 8;
  res := $4 shl 8;
  ShowMessage(Format('$%X shl %d = $%X (%dd)',[lo, so, res, res]));
end;

Pseudemys Nelsoni 15. Dez 2004 04:43

Re: Hex -> Integer
 
danke lueckie, deine beschreibung ist gut und verständlich^^.
Ich glaube das mir das "im kopf rechnen" schwerfallen wird wenn ich sowas wirklich mal verwenden sollte.

aber im prinzip verstehe ich das nun =)


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