Ce que je sais sur les formats binaires

 

 

 1/ little endian, big endian

  C'est l'ordre des octets pour les entiers de 16 32 ou 64 bits.

  Un entier de 16 bits par exemple (INTEGER*2 ou short int)
  est reference par une adresse memoire.

  C'est l'adresse de l'octet de poids FAIBLE pour le LITTLE ENDIAN,
    l'octet suivant est l'octet de poids fort.
  C'est l'adresse de l'octet de poids FORT pour le BIG ENDIAN.
    l'octet suivant est l'octet de poids faible.

     A A+1
   Little  0 2^8 nombre = [A] + [A+1]*2^8
   Big 2^8  0  nombre = [A]*2^8 + [A+1]

  Rien de bien mechant me direz-vous, il suffit de le savoir.
  Que se passe-t-il pour un entier sur 32 bits (INTEGER*4
  ou int)?
  En LITTLE ENDIAN, l'adresse memoire est toujours l'adresse
  de l'octet de poids faible, le suivant contient l'octet
  de poids 2**8, le suivant 2**16 et le suivant 2**24.
  En BIG ENDIAN c'est le contraire.

     A A+1 A+2 A+3
   Little  0  8 16 24
   Big 24 16  8  0
 

  Intel et DEC sont little, tous les autres sont encore big
  mais vont passer little ou feront les 2.
  WIndows, Windows NT, OS/2, Netware, Digital (vms et unix) son little.
  Mac OS et les autres unix sont big.
  Power, Sparc, Motorola, HP-PA sont big seulement.
  Alpha, Intel sont little.
  Tous les prochains PowerPC, HP-PA 8000, Ultrasparc seront les 2.

  Quand on sait ce qui se trouve dans un fichier il suffit
  de faire les swaps necessaires MAIS NUL PART dans un fichier
  n'est indique que sont ecrits des entiers, des caracteres ou
  des flottants.

  EN PARTICULIER pour les HKL les intensites sont des
  entiers sur 8 bits ecrits deux par deux en format
  INTEGER*2.
 

  DEC Alpha sous OpenVMS et sous Digital Unix sait lire
  en LITTLE et en BIG. Il suffit de lui dire.

   . par une option de compilation pour tous les OPEN
   . par une option de compilation pour une unite logique
   . dans l'ordre OPEN
   . par une variable d'environnement a positionner
   avant l'execution du programme.
 

  donc si on veut lire les fichiers .HKL ecrits en BIG
  il suffit de faire
   setmarxdsnew
   setenv FORT_CONVERT8 BIG_ENDIAN
   marscale ...

  ici l'unite 8 est lue en BIG_ENDIAN.
 
 

 2/ Les formats flottants VAXG, VAXD, IEEE.
  Chacun a sa norme, Cray, IBM, VAX, Alpha, etc.
  Tout le monde va vers IEEE.

  Ce qui differe c'est l'ordre des octets
  (comme little et big endian)
  et les longueurs de la mantisse et de l'exposant.
  IEEE est tel que l'adresse du flottant est celle de l'octet
  contenant les bits de poids faible de la mantisse, l'exposant
  est code sur 8 bits.
  VAXD est comme IEEE mais en ordre inverse
  VAXG est comme VAXD mais avec un exposant sur 11 bits.

  DEC Alpha sous OpenVMS et sous Unix OSF/1 sait lire
  dans les 3 formats. Il suffit de lui dire.

   . par une option de compilation pour tous les OPEN
   . par une option de compilation pour une unite logique
   . dans l'ordre OPEN
   . par une variable d'environnement a positionner
   avant l'execution du programme.
 

  donc si on veut lire les fichiers .HKL ecrits en VMS et
  qui sont en VAXD LITTLE_ENDIAN
  il suffit de faire
   setmarxdsnew
   setenv FORT_CONVERT8 VAXD
   marscale ...

  ici l'unite 8 est lue en VAXD.
 

  J'ai ecrit un program mequi convertit de VMS (VAXD) en
  IEEE pour les .HKL

   setendian
   hkl_vmstoosf fifi.hklvms fifi.hklmosf