Domanda

Attualmente sto cercando di imparare un po 'di roba in profondità di formati di file.

Ho una specifica per un formato di file 3D (U3D in questo caso) e voglio cercare di attuare tale. Nulla di grave, solo per l'effetto di apprendimento.

Il mio problema inizia molto presto con i tipi, che hanno bisogno di essere definito. Devo definire diversi numeri interi (8Bit, 16bit, 32bit non firmato e sottoscritto) e questi poi devono essere convertiti in esadecimale prima di scrivere che in un file.

Come faccio a definire questo tipo, dal momento che non posso creare un I16 vale a dire? Un altro problema per me è come convertire che I16 a un numero esadecimale con 8 cifre (Cioè 0001 0001).

È stato utile?

Soluzione

Hex è solo una rappresentazione di un numero. Sia che si interpreta il numero come binario, decimale, esadecimale, ottale ecc sta a voi. In C ++ si dispone di supporto per decimale, esadecimale, e le rappresentazioni ottale, ma sono tutti memorizzati nello stesso modo.

Esempio:

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

Probabilmente il formato del file che si vuole memorizzare i file in formato binario normale. Non credo che il formato del file vuole che i numeri esadecimali come una stringa di testo leggibile. Se lo fa anche se allora si potrebbe utilizzare std :: esadecimale per eseguire la conversione per voi. (Esempio: file << hex << number;)

Se i colloqui di formato di file su come scrivere più di un tipo di 1 byte in un file poi fare attenzione alle Endianness della vostra architettura. Il che significa che fai si memorizza il byte più significativo del tipo di byte più prima o l'ultima.

E 'molto comune nelle specifiche del formato di file per mostrare come il binario dovrebbe cercare una determinata parte del file. Da non confondere però con la realtà memorizzazione cifre binarie come stringhe. Allo stesso modo che a volte dare una scorciatoia per questo specificando in esadecimale come dovrebbe apparire. Anche in questo caso il più delle volte lo fanno stringhe di testo in realtà non medi.

La più piccola unità indirizzabile in C ++ è un char che è 1 byte. Se si vuole bit impostati all'interno di quel byte è necessario utilizzare gli operatori bit a bit come & e |. Ci sono molti tutorial su operatori bit a bit, quindi non entrerò nei dettagli qui.

Altri suggerimenti

Se si include <stdint.h> si ottengono tipi come:

uint8_t
int16_t
uint32_t

In primo luogo, mi permetta di capire. Gli interi vengono memorizzati come testo in un file, in formato esadecimale, senza il prefisso 0x?

Poi, usando la seguente sintassi:

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

Scriverà 0abc1234 in un file.

Come per "definire diversi numeri interi (8Bit, 16bit, 32bit non firmato e sottoscritto)", a meno che non si tira il proprio, e le operazioni matematiche concomitante per loro, si dovrebbero usare per i tipi forniti dal sistema. Vedere stdint.h per le typedef disponibili, come int32_t.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top