Question

Je tente actuellement d'apprendre un peu plus en profondeur des choses de formats de fichiers.

J'ai une spécification pour un format de fichier 3D (U3D dans ce cas) et je veux essayer de mettre en oeuvre. Rien de grave, juste pour l'effet d'apprentissage.

Mon problème commence très tôt avec les types, qui doivent être définis. Je dois définir des entiers (8bits, 16bits, 32bits non signé et signé) et ceux-ci doivent alors être converties en hex avant d'écrire que dans un fichier.

Comment définir ces types, puisque je ne peux pas créer un I16 dire? Un autre problème pour moi est de savoir comment convertir ce I16 à un nombre hexadécimal de 8 chiffres (À savoir 0001 0001).

Était-ce utile?

La solution

Hex est juste une représentation d'un nombre. Que vous interprétez le nombre en binaire, décimal, hexadécimal, octal etc est à vous. En C ++, vous avez le support pour les décimales, hexadécimal, et les représentations octal, mais ils sont tous stockés de la même manière.

Exemple:

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

Probablement le format de fichier que vous souhaite stocker les fichiers au format binaire normal. Je ne pense pas que le format de fichier veut que les nombres hexadécimaux comme une chaîne de texte lisible. Si elle ne se alors vous pouvez utiliser std :: hex pour effectuer la conversion pour vous. (Exemple: file << hex << number;)

Si les pourparlers de format de fichier sur l'écriture plus d'un type 1 octet fichier, puis faites attention à la Endianness de votre architecture. Quels sont les moyens stockez-vous le plus important octet du type multi octet premier ou dernier.

Il est très fréquent dans les spécifications du format de fichier pour vous montrer comment le binaire doit rechercher une partie donnée du fichier. Ne pas confondre cependant avec le stockage en fait des chiffres binaires sous forme de chaînes. De même, ils donnent parfois un raccourci en spécifiant dans l'hexagone comment il devrait ressembler. Encore une fois la plupart du temps ils font des chaînes de texte en fait pas dire.

La plus petite unité adressable en C ++ est un char qui est de 1 octet. Si vous voulez bits définis dans cet octet, vous devez utiliser comme & opérateurs au niveau du bit et |. Il existe de nombreux tutoriels sur les opérateurs au niveau du bit, donc je ne vais pas entrer dans les détails.

Autres conseils

Si vous incluez <stdint.h> vous obtiendrez types tels que:

uint8_t
int16_t
uint32_t

Tout d'abord, permettez-moi de comprendre. Les entiers sont stockés sous forme de texte dans un fichier, au format hexadécimal, sans préfixe 0x?

Ensuite, utilisez la syntaxe suivante:

fprintf (fp, "% 08x", numéro);

Écrira 0abc1234 dans un fichier.

Comme pour « définir différents entiers (8bits, 16bits, 32bits non signé et signé) », à moins que vous roulez vos propres, et des opérations mathématiques concomitantes pour eux, vous devriez en tenir aux types fournis par votre système. Voir stdint.h pour les typedefs disponibles, tels que int32_t.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top