AGB  ·  Datenschutz  ·  Impressum  







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

Bytes auf ein Integer auffädeln

Ein Thema von Kostas · begonnen am 6. Sep 2018 · letzter Beitrag vom 7. Sep 2018
Antwort Antwort
Seite 2 von 2     12   
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 23:18
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.476 Beiträge
 
Delphi 12 Athens
 
#12

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 23:33
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Bytes auf ein Integer auffädeln

  Alt 7. Sep 2018, 09:18
Ich benutze in solchen Fällen gerne variante Records:
Delphi-Quellcode:
  TMyRec = packed record
    case tag : byte of
      0 : (b1 : Byte;
           b2 : Byte;
           b3 : Byte;
           b4 : Byte);
      1 : (MyInt : Integer);
  end;
Mit deinem Beispiel müsste es dann so funktionieren:
Delphi-Quellcode:
var
  vRec : TMyRec;
begin
  vRec.MyInt := 0; // Initialisierung. Damit sind die b-Werte auch initialisiert
  vRec.b1 := $10;
  vRec.b2 := $5f;
end;
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.
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.
Peter
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Bytes auf ein Integer auffädeln

  Alt 7. Sep 2018, 10:06
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
  Mit Zitat antworten Zitat
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
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Bytes auf ein Integer auffädeln

  Alt 7. Sep 2018, 14:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Bytes auf ein Integer auffädeln

  Alt 7. Sep 2018, 14:15
Ahh, okay dann macht es Sinn In dem Falle ist meine Vorgehensweise natürlich hinfällig.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.476 Beiträge
 
Delphi 12 Athens
 
#18

AW: Bytes auf ein Integer auffädeln

  Alt 7. Sep 2018, 14:41
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]]);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: Bytes auf ein Integer auffädeln

  Alt 7. Sep 2018, 15:16
Perfekt Uwe,

genau das habe ich gemeint. Bau gerne wieder alles um.

Herzlichen Dank an Euch.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 10:41 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