Herunterladen Inhalt Inhalt Diese Seite drucken

IFTOOLS MSB-RS485-PLUS Handbuch Seite 139

Inhaltsverzeichnis

Werbung

Bytefolgen in Zahlen umwandeln
Bei der Analyse von Protokollen ist es oftmals erforderlich eine bestimmte
Bytesequenz in eine Zahl zu konvertieren. Die verwendeten Zahlwerte kön-
nen dabei in den unterschiedlichsten Formaten vorliegen: Integer (Ganzzahl)
Werte werden als zwei oder vier Bytes übertragen, Fließkommazahlen in Fol-
gen von vier (einfache Genauigkeit) oder acht Bytes (doppelte Genauigkeit).
Und: Selbst die Reihenfolge ist relevant. Manche Protokolle übertragen das
höcherwertigste Byte zuerst (Big Endian), andere senden als erstes das nie-
derwertigste Byte (Low Endian).
Glücklicher Weise enthält der Lua Interpreter eine mächtige Funktion um all
diese verschiedenen Typen zu verarbeiten.
Die Funktion bunpack erwartet zwei obligatorische Parameter: Die Bytesequenz
als Lua String, und wie diese umzuwandeln ist als zweiten Formatstring. Ein
optionaler dritter Parameter spezifiziert die Position innerhalb der Bytefolge ab
der die Konvertierung starten soll, falls diese vom Stringanfang abweicht.
pos , val1 , . . . = bunpack ( sequence , format , p o s i t i o n )
Die Funktion liefert immer mindestens zwei Werte zurück. Der erste (hier pos)
gibt die Stringposition an, ab der die nächste Umwandlung erfolgt. Danach
folgen abhängig vom Format Parameter mindestens ein oder mehrere Werte.
Bevor wir zu unserem Tutorial zurückkehren, hier einige Beispiele die Ihnen
eine Vorstellung der Arbeitsweise von bunpack vermitteln.
1
seq = " \ 2 4 8 \ 0 3 6 \ 0 0 1 \ 0 0 0 \ 1 5 4 \ 1 5 3 \ 0 4 5 \ 0 6 5 "
2
pos , i = bunpack ( seq , " < I " )
3
pos , f = bunpack ( seq , " < f " , pos )
In Zeile 1 generieren wir eine Zeichenfolge mit den einzelnen Zeichen in dezi-
maler Notation. So erzeugt ein "\255" ein einzelnes hex FF Byte und die Einga-
be "\104\101\108\108\111" ist gleichbedeutend mit dem String "hello". Die de-
zimale Notation erlaubt uns Sequenzen mit Bytewerten zu erzeugen die nicht
unbedingt Teil der normalen Tastatur sind.
Die obige Sequenz ist nicht zufällig gewählt.
Die ersten vier Bytes repräsentieren eine 32-Bit Integerzahl mit dem Wert
75000 in Little-Endian Ordnung (also das niederwertigste Byte zuerst). Die
Bytes 5...8 sind das binäre Äquivalent der Zahl 10.85, ebenfalls im Little-Endian
Format (LE). Die folgende Tabelle zeigt die Bytefolge in hexadezimaler Schreib-
weise:
LE Integer 75000
F8
24
01
00
1
Byte position
Und nun lassen Sie uns sehen wie bunpack aus dieser Aneinanderreihung
von Bytes echte Zahlen reproduziert. Wir beginnen mit dem 32-Bit Integerwert.
2
pos , i = bunpack ( seq , " < i " )
Das erste Argument eines bunpack Aufrufes ist immer der zu konvertierende
String. Der zweite (Format) Parameter "<i" gibt den Datentyp an, den wir an
einer bestimmten Position - übergeben als dritter Parameter - erwarten. Da die
13.3. TEMPLATE SPRACHSYNTAX
LE Float 10.85
9A
99
2D
41
8
127

Werbung

Inhaltsverzeichnis
loading

Inhaltsverzeichnis