Forum Programmation.c types (float, int) indépendant de l'architecture?

Posté par  (site web personnel) .
Étiquettes : aucune
0
5
juin
2007
Bonjour!

Je suis en train de travailler sur un convertisseur de fichiers binaires (propiétaires) vers ascii. Il se trouve que certains types de données sont des flotants, codés sur 4 octets.

J'ai donc écrit une fonction qui permutte les octets selon l'endianess de la machine hote, mais ensuiite j'ai été paresseux et je me suis contenté de faire simplement un cast:

size=4; //IEEE4 & L -> Little endian
ptr=malloc(size);
fread(ptr,(size_t)size,1,data_file);
Fresult=*((float *)ptr);
if(config->big_endian==1) Fresult=ShortSwap(Fresult);
free(ptr);


Y-a-t-il une façon propre et élégante de faire que ceci soit portable (notament 32 vers 64 bytes) sans pour autant avoir à redecoder les flottants à la main?

Merci!
Mathias
  • # ?

    Posté par  (site web personnel) . Évalué à 2.

    Qu'est-ce que tu veux faire plus précisément ?

    "La première sécurité est la liberté"

  • # Voir du coté des fonctions réseau

    Posté par  . Évalué à 2.

    On utilise en général les fonctions suivantes lorsque l'on travaille sur le réseau :

    htonl, htons, ntohl, ntohs
    • [^] # Re: Voir du coté des fonctions réseau

      Posté par  (site web personnel) . Évalué à 2.

      Oui, mais ces fonctions changent l'endianess des chiffres (entiers ou flottants). Ce que je souhaite faire, c'est que un groupe de 4 octets (venant du fichier binaire créé par un système embarqué) soit lu comme, par exemple, un entier sur le système hote, quelque soit l'architecture du système hote.

      Donc je commence par placer les octets dans le bon ordre (avec mes fonctions ShortSwap, IntSwap, FloatSwap, etc car les htonl et consort m'ont donné beaucoup trop de fil à retordre), puis ensuite il faut que je fasse interpreter les octets comme étant un entier codé sur 4 octets.

      Si sur ma plateform "int" est défini comme étant sur 4 octets, je fait mon simple resultat=(int)(......). Idem pour les floats, etc. Mais si d'aventure ma plateforme code ses "short int", "int", "float" de façon différente à ce à quoi je m'attend, alors mon programme ne marche plus. Donc je me dis qu'il doit bien y avoir une façon portable de faire ceci, ie une façon qui ne dépende pas des conventions utilisées sur chaque plateforme!

      Mathias
      PS: pour information, j'ai déja traité le cas de flottants codés sur 2 octets ainsi que sur 4 octets mais avec une représentation non-traditionelle, tout à la main (ie: masques sur les bits, décalages de bits, calcul de la mantisse et de l'exposant, etc).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.