Seite 1 von 1

Python und Binaerdaten

Verfasst: Mittwoch 21. Februar 2007, 21:29
von nkoehring
Ja ich hab vorhin versehendlich einen steinalten Thread wieder hochgeholt, weil ich Fragen zu Python im Zusammenhang mit dem Handling von Binaerdateien habe.

Im großen un ganzen wuerde ich gern eine Aufgabe loesen, die wir mal als C-Aufgabe im Studium bekamen. Ich habe sie auch erfolgreich geloest und habe an ihr erkannt, dass ich garnicht weiß, wie ich das mit Python anstellen sollte...

Das wichtigste an der Aufgabe ist die Struktur:

Code: Alles auswählen

struct filestruct
{
    char GTag[7];
    char Name[31];
    char Vorname[21];
    short Einstellungsdatum[3];
    char Familienstand;
    float Arbeitszeit;
    float Grundgehalt;
    float Zuschlaege[5];
}__attribute__ ((packed));
Mit dieser Struktur wurden nun Daten in eine Datei geschrieben... die Anzahl der Datensaetze belaeuft sich auf 16, glaube ich. Aber eigentlich ist es besser, diese als unbekannt anzunehmen.

Das Modul struct sollte ich mir mal ansehen und hab es auch getan.
Nun weiß ich, dass ich mit struct.unpack(fmt, s) Binaerdaten lesen kann. Aber das mit dem Format ist mir irgendwie zu schlecht erklaert, bzw ich finde nix vernuenftiges.

Ich habe arrays und shorts... wie soll ich das genau definieren?

Ach und dann ist da noch das gcc-Abhaengige "__attribute__((packed))"...

Verfasst: Mittwoch 21. Februar 2007, 22:11
von mitsuhiko
So schlecht ist das jetzt auch nicht dokumentiert: http://docs.python.org/lib/module-struct.html

In deinem Fall schaut der string etwa so aus: '7c31c21c3hcfff5f'

Verfasst: Mittwoch 21. Februar 2007, 22:25
von nkoehring
Achja... ich verlasse mich irgendwie immer nur auf die lokalen Dokumentationen, die mitgeliefert sind :oops:

Danke erstmal, ich probier mal weiter...

Verfasst: Mittwoch 21. Februar 2007, 22:42
von nkoehring
okay das klappt jetzt soweit... bis auf die Tatsache, dass es eine "packed" Struktur ist...

Eben wie ich es angesprochen habe:
Ach und dann ist da noch das gcc-Abhaengige "__attribute__((packed))"...

Verfasst: Donnerstag 22. Februar 2007, 00:34
von BlackJack
Das Attribut sagt doch nur aus, dass die Daten alle so hintereinander stehen wie in dem ``struct`` aufgeführt, ohne Füllbytes dazwischen um die Datentypen auf Wortgrenzen für den Prozessor auszurichten. Wo ist da jetzt das Problem?

Verfasst: Donnerstag 22. Februar 2007, 00:44
von nkoehring
Ganz einfach...:

Code: Alles auswählen

psy@BrAIN1ak> ./dat_reader.py                                                                                                               ~/devel/c/schroeter01/SPZ_A32
160348
Mller
Dieter
256
19712
22016

2.00387573242
2.47987789232e-41
2.35418142007e-41
2.37772323427e-41
0.0
0.0
2.59024091065e-09
0437
hulze
tra
15360
22016
0

2460
0
0
0                                                                                                                                                                         0
0
0
...die Binaerdaten sind gestutzt... es passt nicht mehr in das 96byte-lange Schema. Das Problem hat man zB auch, wenn man im C-Programm das Attribute weglaesst.

Verfasst: Donnerstag 22. Februar 2007, 09:20
von BlackJack
Ach so. Dann musst Du bei der Formatzeichenkette angeben, ob Du Little- oder Big-Endian haben willst, oder "native". Wenn Du nichts angibst, dann wird die Ausrichtung benutzt, die der C-Compiler benutzen würde, mit dem der Interpreter übersetzt wurde.

Verfasst: Donnerstag 22. Februar 2007, 12:55
von nkoehring
Einen wunderschoenen guten Tag...

@BlackJack: Ja diese Vermutung hatte ich gestern schon, bin aber dann doch lieber erstmal ins Bett.

Und es funktioniert :) Vieles Dank.