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 Nicolas Boulay (site web personnel) . Évalué à 2.
"La première sécurité est la liberté"
# Voir du coté des fonctions réseau
Posté par Obsidian . Évalué à 2.
htonl, htons, ntohl, ntohs
[^] # Re: Voir du coté des fonctions réseau
Posté par Mathias Bavay (site web personnel) . Évalué à 2.
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).
[^] # En utilisant la libc ?
Posté par Toto . Évalué à 3.
https://stage.maemo.org/svn/maemo/projects/haf/doc/api/glib/(...)
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 2.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: En utilisant la libc ?
Posté par Mathias Bavay (site web personnel) . Évalué à 1.
Merci beaucoup,
Mathias
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.