Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#15

AW: Bytes auf ein Integer auffädeln

  Alt 7. Sep 2018, 13:57
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];
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 7. Sep 2018 um 14:00 Uhr)
  Mit Zitat antworten Zitat