Hintergrund: Ich schreibe C-Code für Mikrocontroller, um eine EBML-Datei zu schreiben. EBML ist wie ein binäres XML mit verschachtelten Elementen, aber anstelle von Start- und End-Tags gibt es eine Start-ID, eine Länge und dann die Daten. Ich schreibe dies in einer Anwendung mit geringem Stromverbrauch in externes Flash, daher möchte ich die Flash-Zugriffe auf ein Minimum beschränken. Der Speicher ist ebenfalls begrenzt, da nichts jemals einfach ist.
Wenn ich das gesamte EBML-Element im Speicher behalten kann, ist es einfach, es zu generieren, da ich zurückgehen und die Länge jedes Elements eingeben kann, nachdem ich weiß, wie lang es ist. Das Problem ist, was zu tun ist, wenn ich nicht das gesamte Element im Speicher halten kann. Die Optionen, die ich sehe, sind:
- Schreiben Sie, was ich weiß, und gehen Sie dann zurück und fügen Sie die Längen hinzu (am einfachsten, fügt aber mehr Flash-Zugriff hinzu, als ich möchte).
- Berechnen Sie die Länge jedes Elements, bevor ich mit dem Schreiben beginne (relativ einfach, aber viel Prozessorzeit).
- Wechseln Sie den Modus, sobald mein Speicher voll ist, so dass ich dann mit den Daten fortfahre, aber nur, um die Längen für Elemente zu berechnen, die bereits im Speicher reserviert sind. Schreiben Sie dann, was ich im Speicher habe, und gehen Sie zurück und verarbeiten Sie die Daten dort weiter, wo ich aufgehört habe. (Meine bisherige Lieblingsoption)
- Geben Sie Elementen eine maximale oder Worst-Case-Länge, wenn sie geschrieben werden müssen und ihre endgültige Länge noch nicht bekannt ist. (Einfacher als oben, könnte aber nach hinten losgehen und Platz verschwenden)
Frage: Es scheint, dass dies ein relativ häufiges Thema sein sollte, über das die Leute nachgedacht haben. Ich weiß, dass es auch beim Bilden einiger Datenpakete passieren kann. Gibt es eine bessere / allgemeinere / akzeptiertere Technik, die mir hier fehlt? Oder nur einige Begriffe für das Problem, nach dem ich suchen kann?