Byte Array to LongWord
-
- Beiträge: 2
- Registriert: Mi 18. Sep 2013, 21:29
Byte Array to LongWord
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
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
Re: Byte Array to LongWord
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;
-
- 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
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
-------------------------
-------------------------
Re: Byte Array to LongWord
@Vbxler: "packed" sollte reichen
Code: Alles auswählen
aByte : packed array[0..3] of Byte;
-
- 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
"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
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
-
- 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
Ich möchte doch durchaus an das erinnern, was immer mitgeliefert wird: Der Record LongRec aus der Unit Sysutils.
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.theo hat geschrieben:@Vbxler: "packed" sollte reichen
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Byte Array to LongWord
Stimmt, ist unnötig wie bitpacked. Schaden tut es allerdings auch nicht.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.
-
- Beiträge: 2
- Registriert: Mi 18. Sep 2013, 21:29
Re: Byte Array to LongWord
Danke für die Antworten!
Die Variante mittels Move funktioniert einwandfrei, sofern man die Parameter richtig übergibt
:
ist, anders als in C/CPP, nicht das gleiche wie
Lg Peter
Die Variante mittels Move funktioniert einwandfrei, sofern man die Parameter richtig übergibt

Code: Alles auswählen
Move(src, dest, 4);
Code: Alles auswählen
Move(src[0], dest, 4);
Lg Peter
Re: Byte Array to LongWord
Ich würde aber trotzdem eine der anderen Varianten empfehlen.Peter Ustinov hat geschrieben: Die Variante mittels Move funktioniert einwandfrei, sofern man die Parameter richtig übergibt:
Mit Move hast du doch einen unnötigen Aufruf einer Funktion drin.