1/ little endian, big endian
2/ Les formats flottants VAXG, VAXD, IEEE.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.
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 .HKLsetendian
hkl_vmstoosf fifi.hklvms fifi.hklmosf