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:
var
I: Integer;
begin
{ 1 Byte } I := PShortInt(@FReceiveBuffer[Index])^;
{ 2 Byte } I := PSmallInt(@FReceiveBuffer[Index])^;
{ 4 Byte } I := PLongInt (@FReceiveBuffer[Index])^;
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:
Delphi-Quellcode:
var
I: Integer;
begin
{ 1 Byte } I := PByte (@FReceiveBuffer[Index])^;
{ 2 Byte } I := PWord (@FReceiveBuffer[Index])^;
{ 4 Byte } I := PDWord(@FReceiveBuffer[Index])^;
In diesem Falle würden die "überschüssigen" Bytes des Integers automatisch auf 0 gesetzt.
Edit:
Jetzt bin ich verwirrt. Einmal verwendest du die gleiche Byte-Order:
Zitat:
Byte 9 und 10 in ein Integer kopieren. Zuerst kommt das Byte 9 und danach das Byte 10.
und einmal drehst du die Reihenfolge um:
Zitat:
Delphi-Quellcode:
MyIntRec.b1 := FReceiveBuffer[13];
MyIntRec.b2 := FReceiveBuffer[12];
MyIntRec.b3 := FReceiveBuffer[11];