IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Convertir 1 Float en 1 Tableau de 4 Octet


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Convertir 1 Float en 1 Tableau de 4 Octet
    Bonjour,

    Voici mon problème : je reçois des valeurs "Float" sous forme de tableau en "octet" (4 octets pour 1 float).

    Je voudrais savoir s'il existe un moyen de convertir un Float en 4 Octets ?

    J'ai trouvé le moyen pour convertir les 4 octets en 1 float, s'il existe un moyen plus simple, je suis preneur

    Mais je sèche pour faire l'inverse...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //Conversion 4 octets en 1 float
     
    //Déclaration
    Float fResult;
    TableauOctet[4];
    unsigned exp;
     
    fResult = TableauOctet[3];
    fResult = fResult/256 + TableauOctet[2];
    fResult = fResult/256 + (TableauOctet[1] | 0x80);
    exp = (unsigned)(TableauOctet[0] & 0x7F) * 2 + ((TableauOctet[2] & 0x80) != 0 ? 1 : 0) - 134;
     
    fResult = (TableauOctet[3] & 0x80) != 0? -ldexp(fResult, exp) : ldexp(fResult, exp);
    Merci d'avance.

    EDIT : correction des fautes

  2. #2
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 297
    Points
    297
    Par défaut
    je pense que ca ca marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    float f=...; // en supposant qu'un float soit sur 4 octets
    char *tab;
    tab = (char*)&f;
    mais attention &f et tab pointent vers la meme adresse donc si tu modifie f ou tab[i] ca modifiera les 2

  3. #3
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 297
    Points
    297
    Par défaut
    note que ce principe la doit aussi marcher pour la conversion char[4] -> float mais faut etre sur que le char[4] represente bien un float avec tous les problemes eventuels de little endian et big endian

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Salut,

    Merci pour ta réponse "straasha", elle fonctionne mais pas entièrement :/

    J'ai réalisé des essais :

    si j''écris 1.0 je recois bien 1.0
    si j'écris 1.1 je reçois 1.0
    si j'écris 65535.0 je reçois bien 65535.0
    si j'écris 65535.0 je reçois 0.0
    si j'écris -1.0 je reçois 65535.0

    Conclusion, je reçois bien des valeurs en Float mais limitées à une plage de valeur en entier de 16 bits.

  5. #5
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 297
    Points
    297
    Par défaut
    tu peux montrer le code qui t'a servi a faire ce tests ?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai penser à autre chose, si je convertissais mon Float en Hexa ? après je pourrais envoyer cette valeur en octet !!

    Par contre comment convertir un float en héxa ?

  7. #7
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 297
    Points
    297
    Par défaut
    on ne converti pas un float en hexa, on affiche une variable en hexa
    je crois que c'est %x (a confirmer) dans le printf

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par SEB_GAPE
    Voici mon problème : je reçois des valeurs "Float" sous forme de tableau en "octet" (4 octets pour 1 float).

    Je voudrais savoir s'il existe un moyen de convertir un Float en 4 Octets ?

    J'ai trouvé le moyen pour convertir les 4 octets en 1 float, s'il existe un moyen plus simple, je suis preneur

    Mais je sèche pour faire l'inverse...
    En supposant que (comme il se doit) le format réseau est MSB en tête, ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <stdio.h>
    #include <limits.h>
    #include <assert.h>
     
    int main (void)
    {
       unsigned char flux[4];
     
       /* ce code n'est pas portable... */
       assert (sizeof (float) == sizeof flux);
       assert (CHAR_BIT == 8);
     
    /* Emission :  */
       {
          float x = 12E34;
          unsigned char *p = (unsigned char *) &x;
     
          printf ("x = %e\n", x);
     
          flux[0] = p[3] & 0xFF;    /* MSB */
          flux[1] = p[2] & 0xFF;
          flux[2] = p[1] & 0xFF;
          flux[3] = p[0] & 0xFF;
     
       }
     
    /* Reception :  */
       {
          float y = 0;
          unsigned char *p = (unsigned char *) &y;
     
          p[3] |= flux[0];
          p[2] |= flux[1];
          p[1] |= flux[2];
          p[0] |= flux[3];
     
          printf ("y = %e\n", y);
       }
     
       return 0;
    }
    J'ai un doute pour savoir si ce code est soumis à l'endianness ou pas...
    Je dirais que non, mais ce n'est pas facile à prouver...

  9. #9
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    J'ai un doute pour savoir si ce code est soumis à l'endianness ou pas...
    Je dirais que non, mais ce n'est pas facile à prouver...
    Moi j'aurais tendance à penser le contraire. Je ne vois pas pour quelle raison un flottant aurait une organisation en mémoire differente par rapport aux autres types.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    "straasha", Voici le code utiliser pour faire mon test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    // "NomParam" est la variable de donnée brute dans laquelle on veut mettre à jour les 32 variables en Float
    void EcritureDonneeBrute(char* NomParam)
    {
    #define Data_size 128 (tableau de 128 octet soit 32 float)
     
    BYTE byData[Data_size];
     
    char szNomVar[15]="";
     
    float  fValeur;
    char *tab;
    int i,j;
     
    	//Lecture des 32 float puis transfère dans les 4 octets associés
    	for(i=1;i<=32;i++)
    	{
    		j=i*4;
    		sprintf(szNomVar,"Param_%d",i);
     
    		fValeur=GetTagWord(szNomVar);
    		tab = (char*)&fValeur;
     
    		byData[j-4]=tab[3];
    		byData[j-3]=tab[2];
    		byData[j-2]=tab[1];
    		byData[j-1]=tab[0];
     
    	}
     
    	//Ecriture
    	SetTagRaw(NomParam,byData,Data_size); // Fonction WINCC pour transférer le tableau d'octet à la variable de donnée brute
    }
    "Emmanuel Delahaye", je n'ai pas les bibliothèque <stdio.h>, <limits.h> et <assert.h>, je ne peux donc pas tester ce code J'utilise le logiciel WinCC développé par Siemens. La fonction "assert" n'est pas reconnu ...

    Sinon pour lire une valeur au format hexa, c'est printf avec l'argument %x qu'il faut utiliser ?

    Désolé je ne suis pas super calé en langage C.

  11. #11
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 297
    Points
    297
    Par défaut
    oui c'est bien %x ou %X

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Problème résolut !!!

    Merci à vous !! et spécialement à "straasha".

    En fait je m'étais trompé dans la façon de récupérer la valeur .
    Je la lisais avec la fonction spécifique qui lit les entier de 16 bit et non les float (GetTagWord au lieu de GetTagFloat).

  13. #13
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 297
    Points
    297
    Par défaut
    content pour toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir un Float en string
    Par Oberown dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/04/2008, 09h42
  2. Convertir un caractere d'un tableau en int
    Par Battosaiii dans le forum C
    Réponses: 8
    Dernier message: 21/03/2006, 16h28
  3. comment convertir un fichier xml en tableau de string (java)
    Par l'indien dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 27/02/2006, 21h00
  4. Probleme <div> et float -> comme un tableau!
    Par elraton dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 19/08/2005, 19h49
  5. convertir n bits d'un tableau en DWORD
    Par romeo9423 dans le forum C++
    Réponses: 8
    Dernier message: 25/02/2005, 23h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo