Eigenes Dateiformat mit Pointers "mappen"



  • Folgendes: Ich schreibe in C# ein eigenes Dateiformat um verschiedene Informationen zu speichern. Teilweise habe ich dort eine Header/Body System z.B

    Header:
    int Größe des Bodies
    byte* Body

    Body:
    *Byte Array an Informationen*

    Ich werde die Datei in C++ dann direkt in den Speicher laden und möchte dann einfach ein struct auf den Header "mappen", sodass ich dann einfach

    *Header*->GrößeDesBodies etc machen kann.

    Für die gängigen Datentypen ist das ja kein Problem, nur für die Pointers müsste ich die ja korrigieren da ich zum Zeitpunkt des Erstellens der Datei, die endgültige Adresse die der Pointer referenziert, nicht weiß.

    Daher dachte ich mir, ich schreibe beim exportieren das Offset vom Anfang der Datei in die Pointer stelle und gehe dann beim importieren in C++ alle pointer durch und aktualisiere sie mit StartAdresseDerDateiImSpeicher + Offset.

    Ist dies so richtig oder gibt es bessere Wege dies zu tun? Gibt es eventuell effizientere Wege alle Pointer heraus zu suchen wie z.B ein Art Pointer Table wo alle Pointer referenziert werden am Anfang/Ende der Datei?

    Dankeschön 😃


  • Mod

    Speicher die Bedeutung der Daten, nicht deren technische Darstellung.



  • Unabhängig vom Aufbau deiner Klasse. Sagen wir, Brotscheibe kennt die Wurst, wobei auch andere Brotscheiben eine Wurst kennen können (z.B. bei einem Sandwich), dann sollte Deine Datei beispielsweise so aussehen (XML ist auch nur eine Wahl):

    <wurst>
        <name>Lyoner 129380</name>
    </wurst>
    <brotscheibe>
        <name>Brotscheibe 12</name>
        <wurst>Lyoner 129380</wurst>
    </brotscheibe>
    <brotscheibe>
        <name>Brotscheibe 13</name>
        <wurst>Lyoner 129380</wurst>
    </brotscheibe>
    

    Statt name kannst Du dann eben IDs nutzen, z.B. die Stelle im Vektor. Das in so ein Format zu konvertieren ist die große Aufbau beim Serialisieren.

    Geht in C# zum Glück etwas einfacher als in C++, siehe z.B. http://tech.pro/tutorial/618/csharp-tutorial-serialize-objects-to-a-file oder unter anderen Google-Ergebnissen zu "C# Serialization".

    Btw.: Richtiges Forum?



  • Ich beschriebe mal die Situation etwas genauer:

    Als Teil eines Programmes welches Map-Dateien eines Spieles auslesen und darstellen wird, schreibe ich einen Map-Converter der das Dateiformat der Welt konvertiert. Die originale Welt-Datei enthält viele Informationen die ich nicht brauche und das Format ist sehr IO lastig.

    Ich lese die Map-Datei in C# ein, suche mir die nötigen Informationen raus und speichere die Informationen in einem Klassensystem. Der größte Teil der Information sind mehrere byte Arrays um die Größe von 64kb pro Array.

    In meinem neuen Format möchte ich jetzt immer jeweils ein Header und Body Teil haben. Body wird einfach ein 64kb Array sein und der Header speichert zusätzliche Informationen wie Größe, Position des Arrays. Da in diesem Format Header/Body nicht gleich hintereinander liegen, möchte ich in der Header Datei die Position von dem Body in der Datei speichern.

    Nachdem ich in C++ später das neue Format in den Speicher lade, möchte ich einfach ein Header Struct auf die Stelle des Headers "mappen". Das Problem steht bereits im ersten Post:

    Für die gängigen Datentypen ist das ja kein Problem, nur für die Pointers müsste ich die ja korrigieren da ich zum Zeitpunkt des Erstellens der Datei, die endgültige Adresse die der Pointer referenziert, nicht weiß.

    XMl scheint mir aus mehreren Gründen keine Lösung. Das ursprüngliche Dateiformat basiert auf einer XML ähnlichen Weise.


  • Mod

    Patrickssj6 schrieb:

    XMl scheint mir aus mehreren Gründen keine Lösung.

    Diese Gründe wären?

    Wieso sind Pointer abgespeichert? Das ist Ursache des Problems und Ansatz zur Lösung. Pointer sind eine technische Umsetzung einer Verknüpfungsbeziehung. Wieso ist nicht einfach nur abgespeichert, was mit wem verknüpft ist?



  • SeppJ schrieb:

    Patrickssj6 schrieb:

    XMl scheint mir aus mehreren Gründen keine Lösung.

    Diese Gründe wären?

    Wieso sind Pointer abgespeichert? Das ist Ursache des Problems und Ansatz zur Lösung. Pointer sind eine technische Umsetzung einer Verknüpfungsbeziehung. Wieso ist nicht einfach nur abgespeichert, was mit wem verknüpft ist?

    Ich möchte direkt mit der Datei im Speicher arbeiten und nicht über einen Zwischenweg wie XML gehen. Ich werde oft und schnell auf die Informationen zugreifen daher erschien es mir am effizientesten, direkt im Speicher damit zu arbeiten.

    Wieso Pointer abgespeichert sind? Weil 1. ich das so implementiert habe 2. ich doch irgendeine Angabe zur Speicheradresse der Raw Data/Bodies brauche.



  • Arbeite in der Datei mit Dateioffsets? Wenn du die Datei dann in den Speicher gemapt hast (Das hast du doch vor?) rechnest du einfach Basisaddresse + Offset.



  • Ethon schrieb:

    Arbeite in der Datei mit Dateioffsets? Wenn du die Datei dann in den Speicher gemapt hast (Das hast du doch vor?) rechnest du einfach Basisaddresse + Offset.

    Ganz genau das wäre eine Mögichkeit. Ich speicher die Offsets ja ab.

    Ich möchte aber gerne direkt dereferenzieren also statt BaseAddress + Header->Offset möchte ich direkt Header->RawData.

    Ist natürlich alles reine Ästhetik aber ich kenne Map Formate die dies ebenfalls so implementiert haben und frage mich, was die eleganteste Lösung ist.



  • ...



  • Wäre natürlich ne Option aber scheint mir dennoch nicht elegant.

    Ich dachte eher daran alle Offsets einmal zu updaten nachdem man die Datei in den Speicher geladen hat und die BaseAddress kennt.

    Dachte halt an CreateFileMapping. Wäre auch nett gewesen die Datei immer an die gleiche Stelle im Speicher zu laden, dann hätte ich die Offsets gleich von Beginn an als Pointer betrachten können aber ich glaube dies ist nicht so einfach Möglich/zuverlässig?


Anmelden zum Antworten