Bytes eines DWORDS rotieren

philipp75

Level-2
Beiträge
67
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Optimierungsfrage - Aus meinem Endgerät kommt die Reihenfolge BC 0B 00 00, ich benötige die Umkehrung nach 00 00 0b bc.

Habe dazu folgenden Code, der funktioniert. Da ich nach wie vor erste Schritte gehe - gibt es bessere Möglichkeiten für diese Rotation/Umkehrung der byteOrder?
Ich nutze in meinem Haus CodeSys 2.3 auf einer Wago. Dieses Beispiel habe ich in CodeSys 3.5 mit Raspberry gemacht.

val ist UDINT
sDataBuff Array [0..200] OF DWORD (aus der Socket werden mehrere Werte gelesen, fürs Beispiel ist nur Index 0 interessant)

Code:
wLowWord := DWORD_TO_WORD(sDataBuff[0]);
wHighWord := DWORD_TO_WORD(SHR(sDataBuff[0], 16));
wLowWord := ROL(wLowWord,8);
wHighWord := ROL(wHighWord,8);
val := (65536 * wLowWord + wHighWord);


Herzlichen Dank!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hinweis: um sicher zu gehen daß sich der Wert von "in" zwischen den beiden Zugriffen nicht ändert, muß das DWORD "in" by-Value (als Kopie) an den Code übergeben werden, oder falls Zugriff by-Reference (auf die Adresse des DWORD), dann muß es in der selben Task beschrieben werden.

Soll der Code sicher richtig funktionieren, ohne diese Randbedingungen beachten zu müssen, dann besser:
Code:
[COLOR="#0000FF"]tdw[/COLOR] := in;  [COLOR="#008000"]//in-Parameter auf lokale Variable umspeichern[/COLOR]
Swap_Byte2 := (ROR([COLOR="#0000FF"]tdw[/COLOR],8) AND 16#FF00FF00) OR (ROL([COLOR="#0000FF"]tdw[/COLOR],8) AND 16#00FF00FF);

Harald
 
Zurück
Oben