![]() |
AW: Bytes auf ein Integer auffädeln
Oh sorry Delphi.Narium,
FReceiveBuffer ist ein array of byte; Da sind eine Menge Bytes enthalten. In diesem Paket muss ich z.B.: das Byte 9 und 10 in ein Integer kopieren. Zuerst kommt das Byte 9 und danach das Byte 10. Als Beispiel: FReceiveBuffer[9] := $10; FReceiveBuffer[10] := $5f; Wenn das Byte [9]+[10] auf ein Integer geschoben wird, sollte das Ergebnis $105f sein. Gruß Kostas |
AW: Bytes auf ein Integer auffädeln
Delphi-Quellcode:
var
buf: LongRec; begin buf.Bytes[3] := 0; buf.Bytes[2] := 0; buf.Bytes[1] := FReceiveBuffer[9]; buf.Bytes[0] := FReceiveBuffer[10]; Result := Integer(buf); end; |
AW: Bytes auf ein Integer auffädeln
Ich benutze in solchen Fällen gerne variante Records:
Delphi-Quellcode:
Mit deinem Beispiel müsste es dann so funktionieren:
TMyRec = packed record
case tag : byte of 0 : (b1 : Byte; b2 : Byte; b3 : Byte; b4 : Byte); 1 : (MyInt : Integer); end;
Delphi-Quellcode:
Bei der Reihenfolge der Byte-Werte weiß ich leider nicht mehr genau, wie das ganz korrekt sein muss. Ich meine, dass das Mixed Endian ist. Für das Beispiel ist es jedenfalls korrekt.
var
vRec : TMyRec; begin vRec.MyInt := 0; // Initialisierung. Damit sind die b-Werte auch initialisiert vRec.b1 := $10; vRec.b2 := $5f; end; Das kannst du aber einfach prüfen, indem du Testwerte bei MyInt einträgst und nachsiehst, was bei den einzelnen Byte-Werten steht. Einen Link, wie das in Delphi tatsächlich ist, habe ich auf die Schnelle leider nicht gefunden. |
AW: Bytes auf ein Integer auffädeln
Hallo Zusammen,
Die Methode mit dem packed record gefällt mit sehr gut. Das Ergebnis von Test1 und Test2 sind identisch. Ich finde Test1 ist schöner zu lesen. Eigentlich habe ich gehofft es gibt so etwas wie: MyInt := FReceiveBuffer[11] << FReceiveBuffer[12] << FReceiveBuffer[13]; Ich werde die packed record Methode einsetzen.
Delphi-Quellcode:
TMyIntRec = packed record
case tag : byte of 0 : (b1 : Byte; b2 : Byte; b3 : Byte; b4 : Byte); 1 : (MyInt : Integer); end; function Test1:integer; var MyIntRec: TMyIntRec; begin MyIntRec.MyInt := 0; MyIntRec.b1 := FReceiveBuffer[13]; MyIntRec.b2 := FReceiveBuffer[12]; MyIntRec.b3 := FReceiveBuffer[11]; result := MyIntRec.MyInt; end;
Delphi-Quellcode:
function Test2:integer;
begin result := FReceiveBuffer[11]; result := result shl 8; result := result or FReceiveBuffer[12]; result := result shl 8; result := result or FReceiveBuffer[13]; end; Herzlichen Dank an ALLE und einen schönen Tag. Gruß Kostas |
AW: Bytes auf ein Integer auffädeln
Um nochmal kurz auf meinen Vorschlag zurückzukommen:
In deinem Beispiel sah es so aus, als ob du die einzelnen Bytes in identischer Reihenfolge auslesen und speichern willst (also gleiche Byte-Order), oder doch nicht? (siehe Edit). Da du die Reihenfolge jetzt augenscheinlich aber umdrehen musst, funktioniert mein Ansatz für dich leider nicht. Ansonsten wäre die Vorgehensweise folgende:
Delphi-Quellcode:
Hier würde die Ausgelesene Zahl tatsächlich auch korrekt sign-extended (im Falle von 1 und 2 Byte), wenn sie dem Integer zugewiesen wird. Also wenn im 1-Byte Falle die Zahl beispielsweise "-1" wäre, würde der Integer nach der Zuweisung ebenfalls "-1" enthalten. Anders als bei deiner manuellen Shifterei. Dort hätte der Integer dann den Wert "255". Willst du explizit keine sign-extension, dann kann man auch einfach unsigned Typen verwenden:
var
I: Integer; begin { 1 Byte } I := PShortInt(@FReceiveBuffer[Index])^; { 2 Byte } I := PSmallInt(@FReceiveBuffer[Index])^; { 4 Byte } I := PLongInt (@FReceiveBuffer[Index])^;
Delphi-Quellcode:
In diesem Falle würden die "überschüssigen" Bytes des Integers automatisch auf 0 gesetzt.
var
I: Integer; begin { 1 Byte } I := PByte (@FReceiveBuffer[Index])^; { 2 Byte } I := PWord (@FReceiveBuffer[Index])^; { 4 Byte } I := PDWord(@FReceiveBuffer[Index])^; Edit: Jetzt bin ich verwirrt. Einmal verwendest du die gleiche Byte-Order: Zitat:
Zitat:
|
AW: Bytes auf ein Integer auffädeln
Sorry Zacherl,
die einzelne Bytes müssen in der Quelle NICHT direkt nacheinander liegen. Ich habe zufällig Byte 11,12,13 verwendet. Das Ziel ist bis zu vier Bytes auf ein Integer zu schieben. Es kommt auch vor das ich z.B.: die drei Bytes 33, 1 und 7 auf ein Integer schieben muss. Gruß Kostas |
AW: Bytes auf ein Integer auffädeln
Ahh, okay dann macht es Sinn :-D In dem Falle ist meine Vorgehensweise natürlich hinfällig.
|
AW: Bytes auf ein Integer auffädeln
Probier doch mal folgende Funktion aus:
Delphi-Quellcode:
function MakeInteger(const Bytes: array of Byte): Integer;
var buf: LongRec; I: Integer; N: Integer; begin Integer(buf) := 0; N := Length(Bytes) - 1; Assert(N < 4, 'mehr als vier Bytes übergeben'); for I := 0 to N do begin buf.Bytes[N - I] := Bytes[I]; end; Result := Integer(buf); end; // Aufruf: MyInt := MakeInteger([FReceiveBuffer[9], FReceiveBuffer[10]]); |
AW: Bytes auf ein Integer auffädeln
Perfekt Uwe,
genau das habe ich gemeint. Bau gerne wieder alles um. Herzlichen Dank an Euch. :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:13 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