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
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#1

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 21:30
Ich rate mal:

L := PInt16(@FReceiveBuffer[9])^

PInt16 ergeben 2 Byte, das heißt, das hier die Bytes 9 und 10 nach L kommen.

Bei L := PInt32(@FReceiveBuffer[9])^ müssten es dann die Bytes 9 bis 12 sein.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#2

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 21:48
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;
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#3

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 21:59
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.385 Beiträge
 
Delphi 12 Athens
 
#4

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 22:10
Das Ergebnis sollte sein = 95($5f)
Ich habe gerade ausprobiert, leider ist das Ergebnis nicht 95 sondern 24320($5f00)
Delphi-Referenz durchsuchenSystem.Swap
https://www.delphipraxis.net/125740-...rtauschen.html
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#5

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 22: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
Online

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

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 22: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.371 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Bytes auf ein Integer auffädeln

  Alt 7. Sep 2018, 08: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.112 Beiträge
 
Delphi 12 Athens
 
#8

AW: Bytes auf ein Integer auffädeln

  Alt 7. Sep 2018, 09: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
Antwort Antwort


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 18:53 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-2025 by Thomas Breitkreuz