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 1 von 2  1 2      
Kostas

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

Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 21:33
Hallo Zusammen,

um z.B.: zwei Bytes auf ein Integer aufzufädeln mache ich das so:

Delphi-Quellcode:
var L: Integer;
begin
  L := FReceiveBuffer[9];
  L := L shl 8;
  L := L or FReceiveBuffer[10];
end;
Ich setze gerade ein Protokoll um und da muss ich diese Aktion öfters machen von ein bis vier Bytes auf ein Integer auffädeln.
Gibt es eine elegantere Möglichkeit dafür?

Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 21:42
Gibt es eine elegantere Möglichkeit dafür?
Definitiv! Sofern die Byte-Order garantiert gleich ist, kannst du auch einfach direkt den Datentyp auslesen, den du brauchst (z.B. Int16, Int32, ..) bzw. den Buffer dahingehend casten mit L := PInt16(@FReceiveBuffer[9])^ . Eventuell macht es ja sogar Sinn für jedes Paket ein struct zu deklarieren (vorrausgesetzt die Struktur ist immer gleich groß) und dann direkt in einem Rutsch auszulesen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 22:06
Keine Ahnung, ginge sowas?
Delphi-Quellcode:
type
  t4 = record
    a : Byte;
    b : byte;
    c : Byte;
    d : Byte;
  end;

var
  i : Integer;
  r4 : t4 absolute i;
begin
  r4.a := FReceiveBuffer[0];
  r4.b := FReceiveBuffer[1];
  r4.c := FReceiveBuffer[2];
  r4.d := FReceiveBuffer[3];
end;
Da r4 an der gleichen Adresse liegt wie i, müsste i nun die 4 Bytes enthalten.
Ob's hier jetzt schon die von Dir gewünschte Reichenfolge ist, weiß ich nicht.
Aber das ließe sich ja ggfls. einfach durch Änderungen der Reihenfolge bei der Zuweisung ändern.
  Mit Zitat antworten Zitat
Kostas

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

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 22:11
Gibt es eine elegantere Möglichkeit dafür?
Definitiv! Sofern die Byte-Order garantiert gleich ist, kannst du auch einfach direkt den Datentyp auslesen, den du brauchst (z.B. Int16, Int32, ..) bzw. den Buffer dahingehend casten mit L := PInt16(@FReceiveBuffer[9])^ . Eventuell macht es ja sogar Sinn für jedes Paket ein struct zu deklarieren (vorrausgesetzt die Struktur ist immer gleich groß) und dann direkt in einem Rutsch auszulesen.
sorry das ich nachfrage, aber wie bekomme ich das zweite Byte auf den Integer aufgefädelt? Ich habe eigentlich nur vier Varianten Auf dem Integer L werden 1,2,3 oder 4 Bytes aufgefädelt.
Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 22:27
Es gibt auch fertige Funktionen ala Point (TPoint), SmallPoint (TSmallPoint), MakeLong usw.

Ansonsten werden meistens Records zum Casten bzw. für Teilzugriffe verwendet, so wie bereits erklärt, von welchen es auch schon Fertige für Integer, Word usw. gibt.


L := (Integer(FReceiveBuffer[9]) shl 8) or FReceiveBuffer[10]; Die Klammern um SHL sind vermutlich nicht nötig, da SHL vor OR aufgelöst wird. (glaub ich)

Und das Wichtige ist der CAST des Buffer[9] auf Word oder gleich auf Integer, denn diese Typen sind schon groß genug, damit das SHL ordentlich schieben kann, ohne links überzulaufen.
$2B or not $2B

Geändert von himitsu ( 6. Sep 2018 um 23:05 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#6

AW: Bytes auf ein Integer auffädeln

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

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 22:33
Oder eine ganz alte Möglichkeit:
Delphi-Quellcode:
type
  Bufferb : Array [0..127] of Byte;
  BufferW : Array [0..63] of Word absolute BufferB;
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Kostas

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

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 22: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.508 Beiträge
 
Delphi 7 Professional
 
#9

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 22: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.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Bytes auf ein Integer auffädeln

  Alt 6. Sep 2018, 23: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
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:57 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