![]() |
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) ? |
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:
Falls die Bytes anders herum im Array stehen, einfach die Indezes vertauschen.
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; Nachti, Fabian |
Re: Hex -> Integer
hallo fabian,
danke für deine antwort. kannst du mir noch sagen wie genau das hier funktioniert? Zitat:
ich versteh rechnungen derart nie :( [edit=Luckie]Smily-Code deaktiviert. Mfg, Luckie[/edit] |
Re: Hex -> Integer
Machen wir es mal im Binärsystem:
Code:
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).
4 : 2 = 2 (d)
100 : 010 = 010 (b) 8 : 2 = 4 (d) 1000 : 0010 = 0100 (b) 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:
hat er einen Wert mit 2^8 multipliziert und ihn mit einen anderen mit einem logischem oder verknüpft.
Word(arr[0] or arr[1] shl 8)
Code:
entspricht:
010 or (010 shl 1)
010 or 100 010 or 100 ------ 110
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; |
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 15:27 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