Lire un fichier de nombres de type flottants little endian sur PowerPC.
4 réponses
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/
In 'fr.comp.lang.c', Bruno Ethvignot <bruno.ethvignot@voila.fr> 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- emdelYOURBRA@noos.fr [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/
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/
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 :
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
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 :
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
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 :
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
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 :
-- -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/
In 'fr.comp.lang.c', Bruno Ethvignot <bruno.ethvignot@voila.fr> 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 :
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 :
-- -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/
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 ?
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.
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.