![]() |
Bytes auf ein Integer auffädeln
Hallo Zusammen,
um z.B.: zwei Bytes auf ein Integer aufzufädeln mache ich das so:
Delphi-Quellcode:
Ich setze gerade ein Protokoll um und da muss ich diese Aktion öfters machen von ein bis vier Bytes auf ein Integer auffädeln.
var L: Integer;
begin L := FReceiveBuffer[9]; L := L shl 8; L := L or FReceiveBuffer[10]; end; Gibt es eine elegantere Möglichkeit dafür? Gruß Kostas |
AW: Bytes auf ein Integer auffädeln
Zitat:
Delphi-Quellcode:
. Eventuell macht es ja sogar Sinn für jedes Paket ein
L := PInt16(@FReceiveBuffer[9])^
Delphi-Quellcode:
zu deklarieren (vorrausgesetzt die Struktur ist immer gleich groß) und dann direkt in einem Rutsch auszulesen.
struct
|
AW: Bytes auf ein Integer auffädeln
Keine Ahnung, ginge sowas?
Delphi-Quellcode:
Da r4 an der gleichen Adresse liegt wie i, müsste i nun die 4 Bytes enthalten.
type
t4 = record a : Byte; b : byte; c : Byte; d : Byte; end; var i : Integer; r4 : t4 absolute i; begin r4.a := FReceiveBuffer[0]; r4.b := FReceiveBuffer[1]; r4.c := FReceiveBuffer[2]; r4.d := FReceiveBuffer[3]; end; Ob's hier jetzt schon die von Dir gewünschte Reichenfolge ist, weiß ich nicht. Aber das ließe sich ja ggfls. einfach durch Änderungen der Reihenfolge bei der Zuweisung ändern. |
AW: Bytes auf ein Integer auffädeln
Zitat:
Gruß Kostas |
AW: Bytes auf ein Integer auffädeln
Es gibt auch fertige Funktionen ala Point (TPoint), SmallPoint (TSmallPoint), MakeLong usw.
Ansonsten werden meistens Records zum Casten bzw. für Teilzugriffe verwendet, so wie bereits erklärt, von welchen es auch schon Fertige für Integer, Word usw. gibt.
Delphi-Quellcode:
Die Klammern um SHL sind vermutlich nicht nötig, da SHL vor OR aufgelöst wird. (glaub ich)
L := (Integer(FReceiveBuffer[9]) shl 8) or FReceiveBuffer[10];
Und das Wichtige ist der CAST des Buffer[9] auf Word oder gleich auf Integer, denn diese Typen sind schon groß genug, damit das SHL ordentlich schieben kann, ohne links überzulaufen. |
AW: Bytes auf ein Integer auffädeln
Ich rate mal:
Delphi-Quellcode:
L := PInt16(@FReceiveBuffer[9])^
PInt16 ergeben 2 Byte, das heißt, das hier die Bytes 9 und 10 nach L kommen. Bei
Delphi-Quellcode:
müssten es dann die Bytes 9 bis 12 sein.
L := PInt32(@FReceiveBuffer[9])^
|
AW: Bytes auf ein Integer auffädeln
Oder eine ganz alte Möglichkeit:
Delphi-Quellcode:
Gruß
type
Bufferb : Array [0..127] of Byte; BufferW : Array [0..63] of Word absolute BufferB; K-H |
AW: Bytes auf ein Integer auffädeln
data[9] := $0;
data[10] := $5f; Das Ergebnis sollte sein = 95($5f) Ich habe gerade ausprobiert, leider ist das Ergebnis nicht 95 sondern 24320($5f00)
Delphi-Quellcode:
procedure SnapshotLength;
begin // FSnapshotLength := data[9]; // FSnapshotLength := FSnapshotLength shl 8; // FSnapshotLength := FSnapshotLength or data[10]; FSnapshotLength := PInt16(@data[9])^; end; |
AW: Bytes auf ein Integer auffädeln
Was bitte ist denn FReceiveBuffer? Gibt es da zufällig eine Definition zu, so dass man weiß, wovon geredet wird?
z. B.:
Delphi-Quellcode:
FReceiveBuffer : Array[0..12345] of Byte;
FReceiveBuffer : Array[0..12345] of Integer; FReceiveBuffer : Array[0..12345] of Char; FReceiveBuffer : Array[0..12345] of Word; |
AW: Bytes auf ein Integer auffädeln
Zitat:
![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:33 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