010 Editor - partie 2
Publié le 8 Juin 2008
Je reviens un petit peu sur 010 Editor et le format de texture.entries.
Ou je vais compliquer les choses... pour les rendres plus simple d'utilisation ;)
(L'informaticien est en grand faineant, mais il est capable de deployer une grande quantité d'energie afin de faire faire a l'ordinateur le maximum de boulot possible, et le minimum pour lui).
On va faire en sorte que la structure de textures.entries soit un peu plus lisible, voir utilisable a d'autres fins.
En particulier a propos de l'UUID.
Une UUID comme on la connait est sous cette forme : "a822ff2b-ff02-461d-b45d-dcd10a2de0c2"
C'est un ensemble d'octets au format en hexadecimal, separé par des "-" a certains endroits (pour des raisons qui m'echappent).
Hors, avec l'exemple de la partie 1, 010 Editor affiche une serie de chiffres decimaux qui n'ont aucun interets.
LLUUID stocke l'UUID, est le resultat presenté ne ressemble en rien a une UUID, mais a un tableau de 16 elements au format decimal.
Logique, c'est ce qu'on lui a demandé de faire.
Pour rappel, on a defini LLUID de cette facon : typedef ubyte LLUUID[16];
Et... c'est tres bien comme ca. il n'existe pas de type "chaine de caracteres en hexadecimal separé par des tirets de temps en temps". C'est juste une histoire de format de presentation, pas de format de données.
Il est possible de dire a 010 Editor : "A chaque fois que tu va lire cette donnée, tu vas faire le travail que je vais te demander et qui est decrit dans une fonction que je vais te decrire".
Dans la partie 1 on a declaré et utilisé directement les structures. pour des raisons de simplicité.
Cette fois, de la meme maniere qu'on a créé le type "LLUID" (tableau de 16 ubyte) on va creer un type de structure, auquel on va rajouter un mot clé pour dire a 010 ce qu'il faudra faire a chaque fois qu'il lira ce type.
typedef ubyte LLUUID[16];
typedef struct
{
float mVersion;
uint32 mEntries;
} EntriesHeader;
typedef struct
{
LLUUID mID;
int32 mSize;
time_t mTime;
} EntriesBody <read=ReadEntriesBody>;
A chaque lecture de EntriesBody, 010 Editor va executer la fonction "ReadEntriesBody".
Que l'on declare ici :
string ReadEntriesBody( EntriesBody &body)
{
string s;
SPrintf(s,"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",body.mID[0],body.mID[1],body.mID[2],body.mID[3],body.mID[4],body.mID[5],body.mID[6],body.mID[7],body.mID[8],body.mID[9],body.mID[10],body.mID[11],body.mID[12],body.mID[13],body.mID[14],body.mID[15]);
return s;
}
La fonction Sprintf permet d'afficher un texte dans un format specifié.
Pour resumer :
"%02x" veut dire "affiche la donnée te correpondant (body.mID[0] pour la premier %02x, et ainsi de suite) au format hexadimal, sur 2 caracteres".
La syntaxe des regles de formatage pour Sprintf est un standard decrit partout sur le web (c'est la meme regle que le bon vieux "printf" du langage C (ou autre langages)).
On a declaré nos nouveaux, type, reste a les utiliser, on rajoute a la fin :
EntriesHeader header;
EntriesBody body[header.mEntries];
Et voila. On se retrouve avec 010 Editor qui nous affiche les UUID au format qu'on connais. (et qui se trouve etre aussi le format du nom de fichier que l'ont peut trouver dans les reperoites de texture du cache secondlife).
cafééééééééééééééé !
Ou je vais compliquer les choses... pour les rendres plus simple d'utilisation ;)
(L'informaticien est en grand faineant, mais il est capable de deployer une grande quantité d'energie afin de faire faire a l'ordinateur le maximum de boulot possible, et le minimum pour lui).
On va faire en sorte que la structure de textures.entries soit un peu plus lisible, voir utilisable a d'autres fins.
En particulier a propos de l'UUID.
Une UUID comme on la connait est sous cette forme : "a822ff2b-ff02-461d-b45d-dcd10a2de0c2"
C'est un ensemble d'octets au format en hexadecimal, separé par des "-" a certains endroits (pour des raisons qui m'echappent).
Hors, avec l'exemple de la partie 1, 010 Editor affiche une serie de chiffres decimaux qui n'ont aucun interets.
LLUUID stocke l'UUID, est le resultat presenté ne ressemble en rien a une UUID, mais a un tableau de 16 elements au format decimal.
Logique, c'est ce qu'on lui a demandé de faire.
Pour rappel, on a defini LLUID de cette facon : typedef ubyte LLUUID[16];
Et... c'est tres bien comme ca. il n'existe pas de type "chaine de caracteres en hexadecimal separé par des tirets de temps en temps". C'est juste une histoire de format de presentation, pas de format de données.
Il est possible de dire a 010 Editor : "A chaque fois que tu va lire cette donnée, tu vas faire le travail que je vais te demander et qui est decrit dans une fonction que je vais te decrire".
Dans la partie 1 on a declaré et utilisé directement les structures. pour des raisons de simplicité.
Cette fois, de la meme maniere qu'on a créé le type "LLUID" (tableau de 16 ubyte) on va creer un type de structure, auquel on va rajouter un mot clé pour dire a 010 ce qu'il faudra faire a chaque fois qu'il lira ce type.
typedef ubyte LLUUID[16];
typedef struct
{
float mVersion;
uint32 mEntries;
} EntriesHeader;
typedef struct
{
LLUUID mID;
int32 mSize;
time_t mTime;
} EntriesBody <read=ReadEntriesBody>;
A chaque lecture de EntriesBody, 010 Editor va executer la fonction "ReadEntriesBody".
Que l'on declare ici :
string ReadEntriesBody( EntriesBody &body)
{
string s;
SPrintf(s,"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",body.mID[0],body.mID[1],body.mID[2],body.mID[3],body.mID[4],body.mID[5],body.mID[6],body.mID[7],body.mID[8],body.mID[9],body.mID[10],body.mID[11],body.mID[12],body.mID[13],body.mID[14],body.mID[15]);
return s;
}
La fonction Sprintf permet d'afficher un texte dans un format specifié.
Pour resumer :
"%02x" veut dire "affiche la donnée te correpondant (body.mID[0] pour la premier %02x, et ainsi de suite) au format hexadimal, sur 2 caracteres".
La syntaxe des regles de formatage pour Sprintf est un standard decrit partout sur le web (c'est la meme regle que le bon vieux "printf" du langage C (ou autre langages)).
On a declaré nos nouveaux, type, reste a les utiliser, on rajoute a la fin :
EntriesHeader header;
EntriesBody body[header.mEntries];
Et voila. On se retrouve avec 010 Editor qui nous affiche les UUID au format qu'on connais. (et qui se trouve etre aussi le format du nom de fichier que l'ont peut trouver dans les reperoites de texture du cache secondlife).
cafééééééééééééééé !