Einzelnen Beitrag anzeigen

Unwissender

Registriert seit: 11. Dez 2003
16 Beiträge
 
#5

AW: Ein vorhandenes Dateiformat "einlesen"

  Alt 24. Jan 2011, 20:58
Hi,

während ich aphton zustimme, dass die Frage ob man einen Stream nimmt oder nicht nebensächlich für den Kern Deiner Frage ist, möchte ich an anderer Stelle auch wiedersprechen. Natürlich lernt man aus Fehlern, dass heißt aber nicht, dass man alle Fehler machen muss. Letztlich gibt es geradde in der SW-Entwicklung nur zu häufig den Hinweis, dass man das Rad nicht neu erfinden muss.

Wichtig ist hier deshalb auch die Erkenntnis, dass Du "normalerweise" lieber eine fertige Bibliothek verwenden solltest. Das heißt nicht, dass Deine Frage hier nicht beantwortet wird, aber im Arbeitsalltag hast Du nicht die Ressourcen um eine Bibliothek neu zu schreiben (ganz so pauschal ist's auch falsch). Tatsächlich kostet das Zeit und Du benötigst Erfahrung. Eine fertige Lösung ist hier häufig günstiger und muss immer noch an das Zielsystem angepasst werden. Du kannst hier davon ausgehen, dass die Entwickler schon "auf die Fresse gefallen" sein werden, natürlich kannst Du das auch selbst tun, aber das ist halt ein hohes Risiko und tut weh.

Natürlich gibt es auch die Situation, dass es noch keine oder keine ausreichend gute/ Deinen Bedürfnissen genügende Bibliothek gibt, schon deshalb ist wie gesagt, Deine Frage auch gerechtfertigt. Wenn Du jetzt einfach drauf los probierst, dann sind Deine Kenntnisse wirklich bescheiden und Du hättest etwas ganz wichtiges noch nicht gelernt, dass Denken viel günstiger ist als Ausprobieren!

Deshalb sollte man sich (wie Du es mit der Frage ja schon tust) Gedanken machen. Was die bekannten Dateien wie z.B. Tiff, GIF, PNG oder JPEG (natürlich auch andere) ausmacht ist ein bestimmter Aufbau. Man hält diesen in einer Spezifikation fest, hier wird Dir google ein guter Freund sein. Natürlich kannst Du auch bei Wikipedia immer Dein Glück versuchen,
Die ganzen Formate sind erstmal nur eine Ansammlung von Bytes. Das heißt ein Stream ist schon mal ein guter Anfang. Der innere Aufbau macht dann den Unterschied. Das ist schon mal eine Wichtige Erkenntnis, Du kannst Dir ein Grundgerüst bauen, dass eine Datei öffnet (und z.B. prüft ob die existiert, wie groß die ist, ob Du Lese-/Schreibrechte hast, ...) und Fehler abfängt und dieses Gerüst kannst Du für alle Dateiformate verwenden.

Wie jetzt die Daten interpretieren musst, sagt Dir die Spezifikation. Hier wirst Du sehen ob Du einen Header hast, der das File als solches Kennzeichnet (wie durch Aphton erwähnt ist das häufig der Fall), einige Dateien haben einen Footer (also etwas am Ende) und manche eine Mischung aus Beidem (z.B. bei PDF möglich).
Hier musst Du einfach schauen, welchen Aufbau die Datei hat und einen geeigneten Algorithmus entwickeln, der so eine Datei effizient auswerten kann. Wie man das am Besten macht hängt stark von dem Format ab. Ein Tiff verwendet mehrere verkettete "Inhaltsverzeichnisse" die ihrerseits wieder eine Menge Einträge unterscheiden, ein Bitmap hingegen umfasst nur einfache Metainfromationen und ein Feld, dass eben die Pixel umfasst.
Es bietet sich hier einfach an zu schauen, was hier gleich ist und was sich vollständig unterschiedlich verhält. Z.B. macht es Sinn das Auslesen von Einträgen in eine eigene Methode zu packen, da hier in der Regel ein festes Format vorliegt (z.B. 4 Byte die die Länge angeben, die nächsten 2 Byte den Typ usw.). Da solltest Du Dich an DRY (Don't Repeat Yourself) halten und den Code entsprechend strukturieren.
An sich bietet es sich dann an, dass Du mit den einfachsten Informationen anfängst, z.B. den Header auswertest und schaust, ob Du die Datei als solche korrekt erkennst oder ob die angegebene Länge in Byte der Dateigröße entspricht. Eine Sache die auch wichtig ist, wunder Dich nicht, wenn Du eine Datei findest, die dem Standard nicht 100%ig entspricht. Das passiert häufiger als man glaubt und auch wenn einige Reader mit solchen Dateien umgehen können, man sollte es nicht nachmachen! Vor allem solltest Du Deinen Reader robust gegen solche Fehler machen. Werden z.B. 500 MByte Nutzdaten angegeben, bleiben aber vom Zeiger aus nur 480 MByte in der Datei übrig (selbst ein Byte zu viel wäre schon schlecht), dann sollte Dein Reader an dieser Stelle ruhig eine Ausnahme auslösen, der Standard sieht sowas nicht vor!

Ich denke hier hilft es, wenn Du Dir einfach ein Format Deiner Wahl nimmst und mit dem mal anfängst. Lies Dir den Aufbau durch und versuche die Ideen zu verstehen. Hinter jedem Format steckt immer mindestens eine Person, die sich auch was dabei gedacht hat. Hast Du dazu fragen, ist die DP sicher hilfsbereit. Ansonsten kannst Du Dir dann überlegen, wie Du einen Reader aufbauen würdest (auch hier kannst Du natürlich ein Review durch die DP einholen). Zu guter letzt bleibt dann die Umsetzung und auch hier werden die Fragen sicher konkreter sein, so dass Dir leichter/ gezielter geholfen werden kann.
  Mit Zitat antworten Zitat