010 Editor - partie 1

Publié le 8 Juin 2008

J'ai trouvé un editeur hexa sympa : "010 Editor".

Il permet en particulier de creer des templates et des scripts dans un langage assez similaire au C pour la lecture et l'edition de fichiers binaires. Il n'est ni libre ni gratuit et fonctionne sous windows, mais rien n'est parfait dans ce bas monde ;)

A titre d'exemple j'ai fait 2 templates pour lire le fichier texture.entries.
La structure du fichier est la suivante :
- l'entete du fichier qui fait 8 octets : la version du fichier + le nombre d'entrée dans le fichier. (pas de "magic number")
- le corps du fichier composé d'un tableau de 24 octets : UUID de la texture + taille de l'image + date

L'UUID fait 128bits, comme il n'existe pas de type de base de 128 bits, je decide de creer un type perso de 16x8bits. J'aurai pu faire 4x32, mais il y a une bonne raison pour ne pas le faire (plus tard) ;)

typedef ubyte LLUUID[16];

Les premiers 32 bits du fichier donnent la version de la structure du fichier. Un nombre a virgule flottante (float).
Les 32 bits suivants representent le nombre d'entrées dans le corps du fichier ou, d'une facon plus pratique, combien de fois on va trouver dans le corps du fichier le tableau : UUID+taille+date. Ce nombre est un nombre entier non-signé de 32 bits (uint32).


Pour faire ca propre je definis la structure de l'entete du fichier dans une... structure ;)

struct FileHeader
{
    float mVersion;
    uint32 mEntries;
} monEntete;


Le corps du fichier est un poil plus complexe, mais très peu.
De la meme maniere on va definir une structure pour donner un sens aux 24 octets suivant.
A la difference près que cette structure sera repetée un certains nombre de fois, ce certain nombre etant tres exactement celui indiqué par "mEntries".
Ce qui donne un tableau de structure de "mEntries" elements.

La structure est la suivante :
- 128 bits representant l'UUID de la texture (de type LLUUID qu'on a defini au debut)
- la taille de l'image, un nombre entier sur 32 bits (int32)
- la date a laquelle la texture a été inserée dans le fichier. Cette date est representée par un entier de 32 bits representant le nobmre de secondes ecoulée depuis le 1er Janvier 1970. Ca parrait bizzare mais cette methode  de representation de date est tres pratique, prend peu de place et est tres utilisée. Tellement utilisée qu'elle a son propre type predefini : time_t. En indiquant time_t le logiciel saura que cet entier de 32 bits represente une date et nous affichera la date dans un format "lisible" plutot que d'afficher betement le nombre de secondes ecoulée entre 1/1/1970 et la date de creation de la texture en question.

C'est parti :

struct FileBody
{
    LLUUID mID;
    int32 mSize;
    time_t mTime;
} mesElements[monEntete.mEntries];

la derniere ligne indique que "mesElements" est un tableau composé de "mEntries" elements. Et qu'on peut trouver ce nombre "mEntries" dans "monEntete".
Par exemple, si mEntries = 100. On aura un tableau de 100 Elements. Soit 100 fois les 24 octets de "FileBody".

Ensuite... bein c'est fini. On lance tout ca dans 010 Editor et il nous affiche une jolie fenetre dans un format humainement lisible, plutot qu'un ensemble insipide de 0 et de 1.

Rédigé par kerunix Flan

Publié dans #y'a de l'idée

Repost0
Pour être informé des derniers articles, inscrivez vous :