Byte Array to LongWord

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Peter Ustinov
Beiträge: 2
Registriert: Mi 18. Sep 2013, 21:29

Byte Array to LongWord

Beitrag von Peter Ustinov »

Hi!
Ich möchte gerne 4 Bytes zu einem LongWord konvertieren.
Momentan verwende ich die Funktion Move um die Bytes zu kopieren, am Ende kommt jedoch nicht das "richtige" Ergebnis heraus.

Ist Move(..) die richtige vorgehensweise, oder gibts es vielleicht eine Funktion dafür?

lg

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Byte Array to LongWord

Beitrag von theo »

Probier mal so:

Code: Alles auswählen

var a,b,c,d:Byte;
  res:LongWord;
begin
  a:=$10;
  b:=$20;
  c:=$30;
  d:=$40;
  res:= (d SHL 24) + (c SHL 16) + (b SHL 8) + a;
  Edit1.Text:=inttohex(res,8);
end;

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Byte Array to LongWord

Beitrag von Vbxler »

Eine andere Möglichkeit wäre:

Code: Alles auswählen

var
    aByte       : bitpacked array[0..3] of Byte;
    dwErgebnis  : DWord  absolute aByte;
begin
 
  //Einzelbyte eintragen
  aByte[0]  :=$10;
  aByte[1]  :=$20;
  aByte[2]  :=$30;
  aByte[3]  :=$40;
 
  //Ergebnis verwenden
  ShowMessage(IntToStr(dwErgebnis));
end;   
Vbxler
-------------------------

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Byte Array to LongWord

Beitrag von theo »

@Vbxler: "packed" sollte reichen

Code: Alles auswählen

    aByte       : packed array[0..3] of Byte;  

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Byte Array to LongWord

Beitrag von Vbxler »

Da hast recht.
Vbxler
-------------------------

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Byte Array to LongWord

Beitrag von mschnell »

"move" ist durchaus anwendbar.

Andere Möglichkeiten sind "absolut", Varianten Record und eine explizite Berechnung. (z B.: x := a[0] + a[1]*$100 + a[2]*$10000 + a[3]*$1000000; )

Wenn der falsche Wert herauskommt, liegt das vermutlich an der Byte-Reihenfolge. ein x86 PC verwendet die "Low-Endian" Speicher-Anordnung, d.h. das Byte mit der niedrigsten Wertigkeit (im Beispiel oben "a[0]") ist bei einer Integer-Zahl auf der niedrigsten Byte-Adresse abgelegt, das nächst höherwetrtige (oben: a[1]), auf der um 1 höheren Adresse, etc.

-Michael

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Byte Array to LongWord

Beitrag von Socke »

Ich möchte doch durchaus an das erinnern, was immer mitgeliefert wird: Der Record LongRec aus der Unit Sysutils.
theo hat geschrieben:@Vbxler: "packed" sollte reichen
Da reicht gar nichts, weil nacheinander folgende Bytes immer zusammenhängen. Der ganze (bit)packed-Kram bringt nur etwas, wenn man Datentypen hat, die nicht an die nächstgrößere Ausrichtungseinheit grenzen. Bei einem Array eines elementaren Datentyps ist das recht sinnfrei.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Byte Array to LongWord

Beitrag von theo »

Socke hat geschrieben: Da reicht gar nichts, weil nacheinander folgende Bytes immer zusammenhängen. Der ganze (bit)packed-Kram bringt nur etwas, wenn man Datentypen hat, die nicht an die nächstgrößere Ausrichtungseinheit grenzen. Bei einem Array eines elementaren Datentyps ist das recht sinnfrei.
Stimmt, ist unnötig wie bitpacked. Schaden tut es allerdings auch nicht.

Peter Ustinov
Beiträge: 2
Registriert: Mi 18. Sep 2013, 21:29

Re: Byte Array to LongWord

Beitrag von Peter Ustinov »

Danke für die Antworten!

Die Variante mittels Move funktioniert einwandfrei, sofern man die Parameter richtig übergibt :roll: :

Code: Alles auswählen

Move(src, dest, 4);
ist, anders als in C/CPP, nicht das gleiche wie

Code: Alles auswählen

Move(src[0], dest, 4); 


Lg Peter

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Byte Array to LongWord

Beitrag von theo »

Peter Ustinov hat geschrieben: Die Variante mittels Move funktioniert einwandfrei, sofern man die Parameter richtig übergibt :roll: :
Ich würde aber trotzdem eine der anderen Varianten empfehlen.
Mit Move hast du doch einen unnötigen Aufruf einer Funktion drin.

Antworten