Hallo zusammen,
ich möchte ein File einlesen, in dem teils Informationen binär gesichert sind. Das File lässt sich strukturiert in Blöcke aufteilen, die durch runde Klammern eingeschlossen sind,
( Dies ist ( ein ) Block) - So sieht ein Block aus.
Das File möchte ich jetzt beim Einlesen gleich in Blöcke aufteilen und habe einen Zähler eingeführt, der die "Klammertiefe" zählt. Wenn der Zähler auf null zurückfällt weiss ich, dass der Block zu Ende ist und ein neuer Block beginnt. Solange innerhalb des Blocks ASCII-Zeichen stehen klappt alles wunderbar, aber bei Blöcken die Binärdaten enthalten kommt die Prüfung (if __c == "(" bzw if __c == ")") durcheinander, weil sie die Binärdaten als ASCII interpretiert und teils "(" oder ")" sieht. Wie könnte ich so etwas lösen?
Danke BastiL
File mit Binärteil einlesen
Falls Du die Datei selbst erzeugst, könntest Du jeden Binärteil durch einen Marker zusammen mit einer Längeninformation über die folgenden Binärdaten einleiten. Ansonsten hast Du stets das Problem, das in den als Text interpretierten Binärdaten Zeichen vorkommen können, die das Parsing stören.
Klaus
Klaus
Wenn das Format, wie in deinem ersten Post beschrieben, so aufgebaut ist und keine weiteren Spezifikationen gegeben sind, ist das Einlesen im Allgemeinen nicht eindeutig. Entweder sind also noch Zusatzinformationen gegeben, oder das Format ist totaler Müll
Das Leben ist wie ein Tennisball.
Es sind noch Zusatzinformationen gegeben, aber das Format ist trotzdem totaler Müll.....
Die Blöcke die Binär sein können haben folgende Form:
(Ordnungszahl (ASCII_HEADER) (Binärkrams))
Jetzt kann ich die Ordnungszahl auslesen und anhand der kann ich feststellen, ob da etwas binäres kommt oder nicht. So weit bin ich inzwischen. Der Header (ASCII) lässt obendrein noch Rückschlüsse darauf zu, wieviele Informationen genau in dem Binärteil stehen. Damit sollten wir doch ein Stück weiter kommen, oder?
BastiL
Die Blöcke die Binär sein können haben folgende Form:
(Ordnungszahl (ASCII_HEADER) (Binärkrams))
Jetzt kann ich die Ordnungszahl auslesen und anhand der kann ich feststellen, ob da etwas binäres kommt oder nicht. So weit bin ich inzwischen. Der Header (ASCII) lässt obendrein noch Rückschlüsse darauf zu, wieviele Informationen genau in dem Binärteil stehen. Damit sollten wir doch ein Stück weiter kommen, oder?
BastiL
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Das solltest du nun genauer erklären. Ist es sowas wie Content-Length?BastiL hat geschrieben:Der Header (ASCII) lässt obendrein noch Rückschlüsse darauf zu, wieviele Informationen genau in dem Binärteil stehen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Nun quasi. Wenn ich den Header einlese kann ich indirekt darauf rückschließen (muss ich mir im Detail noch anschauen) wieviele Werte dort abgelegt sind. Aufgrund der Präzision der Maschine sollte ich auch die Byte-Länge der Fliesskomma-Zahlen rausbekommen können. Damit sollte mir doch geholfen sein, oder?Leonidas hat geschrieben:Das solltest du nun genauer erklären. Ist es sowas wie Content-Length?BastiL hat geschrieben:Der Header (ASCII) lässt obendrein noch Rückschlüsse darauf zu, wieviele Informationen genau in dem Binärteil stehen.
Jetzt ist es wohl so, dass auf Grund der Eigenheiten dieses Formats die Interpretation der Binärwerte bereits beim ersten Durchlauf erfolgen muss, weil ich sonst nachfolgende Blöcke gar nicht korrekt identifizieren kann.
... ich habe gerade mal dazwischen eine Frage zur Umsetzung. Ich habe das File in einem Rutsch in den Speicher geladen und gehe nun den String char für char durch. Sobald ein neuer Block beginnt bleibe ich an der öffnenden Klammer stehen:
Die Ordnungszahl lese ich nun aus, indem ich einen Positionszähler eingeführt habe, der die aktuelle Position im String beinhaltet. Mittels
bekomme ich so die Ordnungszahl durch "Vorauslesen" und kann sie mit Werten aus einer Tabelle vergleichen. Ich weiss nicht ob das die beste Methode ist, aber sie funktioniert auf jeden Fall. Schwierig ist es jetzt, den Header vorauszulesen. Den muss ich aber auch gelesen haben, bevor ich den Binärkrams einlesen kann. Die Position der öffnenden Klammer des Headers kenne ich, danach folgt eine variable Anzahl an Ganzzahlen (leerzeichegetrennt) und eine schließende Klammer. Ich kenne also die Position der schließenden Klammer nicht genau. Wie könnte ich das am geschicktesten einlesen?
Danke.
Code: Alles auswählen
(Ordnungszahl (ASCII_HEADER) (Binärkrams))
Code: Alles auswählen
string[positionszaehler:positionszaehler + 2]
Danke.
Kannst Du nicht einfach ganz normal die schliessende Klammer vom Header suchen? Dann weisst Du wie lang der ist.
Doch im Prinzip schon. aber ich stehe gerade auf dem Schlauch was die Implementierung angeht. Bislang mache ich folgendes:BlackJack hat geschrieben:Kannst Du nicht einfach ganz normal die schliessende Klammer vom Header suchen? Dann weisst Du wie lang der ist.
Code: Alles auswählen
# Einlesen der Datei in einem Rutsch
file = f.read()
# Zeichenweise der Datei entlangwandern und analysieren
for c in file
pos = pos + 1
if c == "(" and level == 0:
if file[pos:pos + 2] == "Ordnungszahl1":
# Blocktyp 1
elif file[pos:pos + 2] == "Ordnungszahl2":
# Blocktyp 2
level = level + 1
elif c == ")"
level = level - 1
Freue mich über vorschläge. Danke.