Frage

Was wäre der beste Weg, um einen Python-String in Bereiche Auspacken

ich Daten von einem TCP-Socket empfangen haben, wird es wie folgt verpackt, ich glaube, es ist in einem String aus der Steckdose recv Funktion sein wird,

Es hat folgendes Format

uint8 - header
uint8 - Länge
uint32 - typeID
uint16 -param1
uint16 -param2
uint16 -param3
uint16 -param4
char [24] - name string
uint32 - Prüfsumme
uint8 - Fußzeile

(Ich brauche auch andere Pakete mit verschiedenen Formaten zu dem oben auspacken)

Wie kann ich entpacken diese?

Ich bin neu in Python, hat ein bisschen ‚C‘ durchgeführt. Wenn ich ‚C‘ unter Verwendung würde ich wahrscheinlich eine Struktur verwenden, wäre dies der Weg sein, mit Python zu gehen?

Viele Grüße

X

War es hilfreich?

Lösung

Das struct Modul ist heterogenen Daten in einem Tupel entpacken auf einem Formatzeichenfolge basiert. Es macht mehr Sinn, die gesamte Struktur auf einmal eher zu entpacken als zu versuchen, ein Feld zu einem Zeitpunkt, zu ziehen. Hier ein Beispiel:

fields = struct.unpack('!BBI4H20sIB', data)

Dann können Sie einen bestimmten Bereich zugreifen, zum Beispiel auf das erste Feld:

fields[0]

Sie können auch die Tupel verwenden, um eine NamedTuple zu initialisieren; Blick auf die Dokumentation für struct für ein Beispiel. NamedTuples sind nur in Python zur Verfügung 2.6+, aber sie verhalten sich eher wie Python-Strukturen, dass Sie Elemente als Attribute zugreifen können, beispielsweise fields.header. Natürlich könnte man auch mit einem wenig mehr Arbeit erreicht dies durch eine Klasse zu schreiben, die Informationen aus dem Tupel zu kapseln ... wieder, wenn Sie sich interessieren. Sie können immer nur Index in Felder direkt, wie ich oben zeigte.

Andere Tipps

struct Modul

Dies ist eine Antwort auf Ihre Frage-als-Antwort:

Es kann sicherlich nicht der beste Weg sein, weil es nicht funktioniert. struct.unpack() gibt immer ein Tupel. Um die einzelnen Artikel in diesem Tupel auszureißen, müssen Sie entweder field1 = struct.unpack('B',data[0])[0] oder field1, = struct.unpack('B',data[0]) tun.

Auch mit dieser Lösung, es ist keine gute Art und Weise: zu viel schreiben, Fehler proneness unnötiger [Start: Ende]., Ineffizienz von 10 Funktionsaufrufe anstelle eines

Wie Sie Namen haben, können Sie sie anstelle von field1 oder Feld [0] ... wie folgt aus:

(header, length, typeID, param1, param2,
param3, param4, name_string, checksum, footer,
) = struct.unpack("!2B I 4H 24s I B", data)

Ist dies der beste Weg, dies zu tun, oder gibt es einen besseren Weg,

Es ist wahrscheinlich, dass es Strings mit anderen Formaten sein, die ein anderes auspacken Schema erfordern

field1 = struct.unpack ( 'B', data [0])
field2 = struct.unpack ( 'B', data [1])
field3 = struct.unpack (Daten [2: 6] 'I')
Field4 = struct.unpack ( '! H', data [6: 8])
field5 = struct.unpack ( '! H', data [08.10])
FIELD6 = struct.unpack ( '! H', data [10.12])
Feld7 = struct.unpack ( '! H', data [12.14])
field8 = struct.unpack ( '20s', data [14.38])
field9 = struct.unpack ( '! I', data [38:42])
field10 = struct.unpack ( 'B', data [42])

Viele Grüße

Werfen Sie einen Blick auf das Modul ' struct '.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top