Frage

Ich versuche derzeit, ein paar Tiefen von Dateiformaten zu lernen.

Ich habe eine Spezifikation für ein 3D -Dateiformat (in diesem Fall U3D) und möchte versuchen, dies zu implementieren. Nichts Ernstes, nur für den Lerneffekt.

Mein Problem beginnt sehr früh mit den Typen, die definiert werden müssen. Ich muss verschiedene ganze Zahlen definieren (8bit, 16bit, 32 -Bit -Unsigned und Signed), und diese müssen dann in Hex konvertiert werden, bevor sie dies in eine Datei schreiben.

Wie definiere ich diese Typen, da ich nicht nur einen i16 -IE erstellen kann? Ein weiteres Problem für mich ist, wie ich diese I16 mit 8 Ziffern (dh 0001 0001) in eine Hex -Nummer konvertieren kann.

War es hilfreich?

Lösung

Hex ist nur eine Darstellung einer Zahl. Ob Sie die Zahl als binär, dezimal, hex, oktal usw. interpretieren, liegt bei Ihnen. In C ++ haben Sie Unterstützung für Dezimal-, Hex- und Oktalpräsentationen, aber sie sind alle auf die gleiche Weise gespeichert.

Beispiel:

int x = 0x1;
int y = 1;
assert(x == y);

Wahrscheinlich möchte das Dateiformat, dass Sie die Dateien im normalen Binärformat speichern können. Ich glaube nicht, dass das Dateiformat die Hex -Nummern als lesbare Textzeichenfolge will. Wenn dies der Fall ist, können Sie STD :: Hex verwenden, um die Konvertierung für Sie durchzuführen. (Beispiel: file << hex << number;)

Wenn das Dateiformat darüber geht, mehr als ein 1 -Byte -Typ zur Datei zu schreiben, achten Sie auf die Endiangess Ihrer Architektur. Das heißt, Sie speichern das bedeutendste Byte des Multi -Byte -Typs zuerst oder zuletzt.

Es ist sehr häufig in den Dateiformatspezifikationen, um Ihnen zu zeigen, wie die Binärdatei nach einem bestimmten Teil der Datei suchen sollte. Verwechseln Sie dies jedoch nicht damit, binäre Ziffern als Saiten zu lagern. Ebenso geben sie manchmal eine Abkürzung dafür, indem sie in Hex angeben, wie es aussehen sollte. Die meiste Zeit bedeuten sie tatsächlich keine Textzeichenfolgen.

Die kleinste adressierbare Einheit in C ++ ist a char Welches ist 1 Byte. Wenn Sie Bits in dieses Byte festlegen möchten, müssen Sie Bitwise -Operatoren mögen & und |. Es gibt viele Tutorials zu Bitwise -Betreibern, daher werde ich hier nicht ins Detail gehen.

Andere Tipps

Wenn Sie einschließen <stdint.h> Sie erhalten Typen wie:

uint8_t
int16_t
uint32_t

Lassen Sie mich zunächst verstehen. Die Ganzzahlen werden als Text in einer Datei im Hexadezimalformat ohne Präfix 0x gespeichert?

Verwenden Sie dann diese Syntax:

fprintf (fp, "%08x", Nummer);

Schreiben Sie 0ABC1234 in eine Datei.

Was "verschiedene ganze Zahlen definieren (8bit, 16bit, 32bit unsigniert und signiert)", es sei denn, Sie rollen Ihre eigenen und begleitenden mathematischen Operationen für sie, sollten Sie sich an die von Ihrem System gelieferten Typen halten. Siehe StDint.h für die verfügbaren Typedefs, wie int32_t.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top