Python und Binaerdaten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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))"...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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'
TUFKAB – the user formerly known as blackbird
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Achja... ich verlasse mich irgendwie immer nur auf die lokalen Dokumentationen, die mitgeliefert sind :oops:

Danke erstmal, ich probier mal weiter...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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))"...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
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?
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
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.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten