OVH Cloud OVH Cloud

Lire un fichier de nombres de type flottants little endian sur PowerPC.

4 réponses
Avatar
Bruno Ethvignot
Bonjour,

J'ai un fichier avec des nombres de types flottants qui ont été
enregistrés il y a fort longtemps dans un fichier par une
application C 80x86.

Existe-il une maniére simple de lire un tel fichier (écrit en little
endian) par un programme C compilé sur une machine fonctionnant sur
PowerPC (big endian).

Le type float est sur 32 bits, utilise 23 bits pour la mantisse, 8 bits
pour l'exposant, et 1 bit pour le signe je crois.

Sinon je recherche des informations sur la structure exacte d'un
flottant 32 bits sur architecture 80x86.

Pour vous donner un aperçu du problème :
- 0.088000 sur 80x86 devient sur PowerPC 816735074648064.000000
- 0.028000 sur 80x86 devient sur PowerPC 56.223862

Merci pour toute aide,
--
Bruno Ethvignot - *bruno* arrobe *tlk* point *fr*
http://linux.tlk.fr
http://mozilla.tlk.fr/contact.php

4 réponses

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Bruno Ethvignot wrote:

J'ai un fichier avec des nombres de types flottants qui ont été
enregistrés il y a fort longtemps dans un fichier par une
application C 80x86.

Existe-il une maniére simple de lire un tel fichier (écrit en little
endian) par un programme C compilé sur une machine fonctionnant sur
PowerPC (big endian).

Le type float est sur 32 bits, utilise 23 bits pour la mantisse, 8 bits
pour l'exposant, et 1 bit pour le signe je crois.


Le format des données est spécifié par chaque compilateur. Il faut faire les
conversions en fonction des chaque spécifications.

Sinon je recherche des informations sur la structure exacte d'un
flottant 32 bits sur architecture 80x86.


C'est dans la doc du compilateur qui a créé le programme.

Borland C:

http://community.borland.com/article/0,1410,15855,00.html
http://community.borland.com/article/0,1410,16431,00.html
http://www.optimalcode.com/Guido/fpv.html
etc. google peut aider...

Pour vous donner un aperçu du problème :
- 0.088000 sur 80x86 devient sur PowerPC 816735074648064.000000
- 0.028000 sur 80x86 devient sur PowerPC 56.223862


Nota. C'est pour éviter ces désagréments que l'on recommande fortement de
stocker les valeurs numériques sous forme de chaines de caractères (format
scientifique par exemple). C'est /beaucoup/ plus portable.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Bruno Ethvignot
Emmanuel Delahaye wrote:
C'est dans la doc du compilateur qui a créé le programme.
Je n'ai pas regardé la documentation mais cela doit être le format

binaire à virgule flottante 32 bits IEEE.

Le fichier a du être créé sur une plate-forme Microsoft avec le Watcom
ou VC, mais est parfaitement lisible avec du code compilé avec GCC 3.2.2
sous Linux 80x86.

Pour lire le fichier avec du code compilé sous GCC 3.2.2 sous
Linux PowerPC j'ai trouver la bidouille suivante :

#if __BYTE_ORDER == __BIG_ENDIAN
unsigned char b0, b1, b2, b3;
char *p8;
#endif
float *p32;
float f;
char *pFichier;

pf32 = (float *)pFichier;
#if __BYTE_ORDER == __BIG_ENDIAN
b0 = p8[1];
b1 = p8[0];
b2 = p8[3];
b3 = p8[2];
p8[0] = b2;
p8[1] = b3;
p8[2] = b0;
p8[3] = b1;
#endif
f = (float)*(_f32++);

Ce n'est peut-être pas très élégant mais cela fonctionne. J'espère que
cela passera sur les autres architectures...

Nota. C'est pour éviter ces désagréments que l'on recommande fortement de
stocker les valeurs numériques sous forme de chaines de caractères (format
scientifique par exemple). C'est /beaucoup/ plus portable.


Je me doute. Mais la personne qui a généré le fichier à l'époque ne
se doutait sûrement pas de ce genre de chose.

Cordialement,
--
Bruno Ethvignot - *bruno* arrobe *tlk* point *fr*
http://mozilla.tlk.fr/contact.php
http://linux.tlk.fr

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Bruno Ethvignot wrote:

Le fichier a du être créé sur une plate-forme Microsoft avec le Watcom
ou VC, mais est parfaitement lisible avec du code compilé avec GCC 3.2.2
sous Linux 80x86.


Si c'est le cas, je te conseille vivement d'en profiter pour en faire un
fichier texte qui sera récupérable sous n'importe quel compilateur sans (ou
quasiment sans) transformation. En tout cas, rien de gore...

Pour lire le fichier avec du code compilé sous GCC 3.2.2 sous
Linux PowerPC j'ai trouver la bidouille suivante :

#if __BYTE_ORDER == __BIG_ENDIAN
unsigned char b0, b1, b2, b3;
char *p8;
#endif
float *p32;
float f;
char *pFichier;

pf32 = (float *)pFichier;
#if __BYTE_ORDER == __BIG_ENDIAN
b0 = p8[1];
b1 = p8[0];
b2 = p8[3];
b3 = p8[2];
p8[0] = b2;
p8[1] = b3;
p8[2] = b0;
p8[3] = b1;
#endif
f = (float)*(_f32++);


... comme ça!

--
-ed- emdel at noos.fr ~]=[o
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
C-library: http://www.dinkumware.com/manuals/reader.aspx

"Say 'No' to the war!" http://www.votenowar.org/

Avatar
moebius
Bruno Ethvignot wrote:
Bonjour,

J'ai un fichier avec des nombres de types flottants qui ont été
enregistrés il y a fort longtemps dans un fichier par une
application C 80x86.

Existe-il une maniére simple de lire un tel fichier (écrit en little
endian) par un programme C compilé sur une machine fonctionnant sur
PowerPC (big endian).


la solution la plus rapide mais la moins portable est d'insérer du code
assembleur dans le C, sur les pentium il existe l'instruction BSWAP:

** 6.4.2 The BSWAP Instruction
** The bswap instruction, available only on 80486 (yes, 486) and later
processors, converts between 32 bit little endian and big endian values.
This **instruction accepts only a single 32 bit register operand. It swaps
the first byte with the fourth and the second byte with the third. The
syntax for the **instruction is
** bswap reg32
**where reg32 is an 80486 32 bit general purpose register.

sur PowerPC il existe peut-être un equivalent ?