[Dcmlib] Big Endian suite: exemple de Jean-Michel

Jean-Pierre Roux jpr at creatis.insa-lyon.fr
Wed Jan 12 17:45:39 CET 2005


jean-michel.rouet at philips.com wrote:

>
> peut etre pour clarifier les choses:
>
> prend ce petit programme:
>
> #include <stdio.h>
>
> int main(int argc, char *argv[])
> {
>   int value = 0x04030201; /* 1 2*256 3*256*256 4*256*256*256 */
>   char *bytes = (char *)(&value);
>   short *shorts = (short *)(&value);
>   printf ("%08x is converted to ", value);
>   printf ("%02x%02x%02x%02x\n", bytes[3], bytes[2], bytes[1], bytes[0]);
>   printf ("%08x is converted to ", value);
>   printf ("%04x%04x\n", shorts[1], shorts[0]);
> }
>
>

Voila qui est clair et qui montre ce qui se passe :
On met sur disque les octets dans l'ordre ou ils sont en mémoire.
Lorsqu'on les relit on les ammene en memoire comme ils sont sur disque.

Si les choses ont ete faites proprement, le SwapCode, tel qu'on l'entend 
ne peut etre que 1234 (processeurs compatibles) ou 4321 (processeurs 
incompatibles)

Les valeurs 2143 ou 3412 sont trouvées/trouvables  sur les fichiers 
ACR-NEMA, pour lesquels le constructeur avait essayé d'ecrire du Little 
Endian, par soft, et s'était vautre dans son programme.
C'est Sebastien Barre qui appelait ca 'Bad Big Endian, Bad Little Endian'.

Pour voir dans quel cas on etait, on 'regardait' la 
longueur-sur-laquelle-est-codee la longueur de l'element 0000 du groupe 
premier groupe trouve.
C'etait obligatoire en ACR-NEMA, ca valait *forcement* 4 (longueur d'un 
int32)
selon qu'on trouvait 0x(00000004), 0x(04000000), etc, on en deduisait le 
swap code, a coup sur.

Si le (salaud de) constructeur avait 'oublié' l'element 0000, on partait 
sur autre chose, qui ne pouvait nous conduire qu'a 1234 ou 4321.
En esperant que ca marche (et ca a toujours ete le cas, jusqu'a 
maintenant; mais il est clair qu'on pourrait forger des images qui font 
peter l'heuristique ...)

JP

> execute sur I386:
> tu obtiens:  
> rouet at joebar /tmp>./test.exe
> 04030201 is converted to 04030201
> 04030201 is converted to 04030201
>
> tu vois que l'ordre est bien little endian
>
> maintenant execute le sur une sparc:
> tu obtiens:
> rouet at tan ~/src/tmp>./test
> 04030201 is converted to 01020304
> 04030201 is converted to 02010403
>
> ou tu vois que l'on est donc sur du big endian, et que lorsque l'on 
> convertit du 32bits sur du 16 bits on obtiens alors 2143
>
> J'espere que c'est parlant.
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Dcmlib mailing list
>Dcmlib at creatis.insa-lyon.fr
>http://www.creatis.insa-lyon.fr/mailman/listinfo/dcmlib
>  
>



More information about the Dcmlib mailing list