AGB  ·  Datenschutz  ·  Impressum  







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

Hex -> Integer

Ein Thema von Pseudemys Nelsoni · begonnen am 15. Dez 2004 · letzter Beitrag vom 15. Dez 2004
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Hex -> Integer

  Alt 15. Dez 2004, 02:42
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)

?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Hex -> Integer

  Alt 15. Dez 2004, 03:13
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#3

Re: Hex -> Integer

  Alt 15. Dez 2004, 03:39
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]
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Hex -> Integer

  Alt 15. Dez 2004, 04:49
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:
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: Hex -> Integer

  Alt 15. Dez 2004, 05:43
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 =)
Mario
MSN: cyanide@ccode.de
  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 23:56 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