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 :

Conversion 4 bytes vers float


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 64
    Par défaut Conversion 4 bytes vers float
    Bonjour,
    Voici mon problème :d'écrit un programme sur une cible hard utilisant le micro framework. J'ai besoin de passer les floats via une liaison série ou autre. Pour cela il faut que je convertisse les float sur 4 octets.
    Avec le framemork on peut le faire avec BitConverter. Sinon le micro framework possède la classe serialization qui fait ce travail, mais malheureusement la carte sur laquelle je travail ne le supporte pas!
    De plus la methode de sérialisation de micro framework n'est pas compatible avec la sérialisation du framework standard selon le livre Expert .NET Micro Framework de Jens Kühner. Je me demande quel est l'intérer de créer une sérialisation s'il est impossible de communiquer avec d'autre !

    Donc je suis obligé de le faire à la main. J'ai trouvé un code qui permet de convertir un float vers 4 octets, mais je n'arrive pas à le faire dans le sens inverse.

    Voici un extrait du code venant de Melem :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    float f = 12.34F;
    byte[] valeur = new byte[4];
    int fake_float = 0;
    unsafe
    {
          fake_float = *(int*)(&f);
    }
    valeur[0] = (byte)((fake_float & 0xff000000) >> 24);
    valeur[1] = (byte)((fake_float & 0x00ff0000) >> 16);
    valeur[2] = (byte)((fake_float & 0x0000ff00) >> 8);
    valeur[3] = (byte)((fake_float & 0x000000ff));
    Quelqu'un pourrait m'aider à le faire dans l'autre sens ? et deplus il faut que ca fonctionne sur micro framework et framework!
    D'avance merci.

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Sans code unsafe, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    float f = 12.34F;
    byte[] valeur = new byte[4];
     
    MemoryStream ms = new MemoryStream();
    ms.Write(valeur, 0, floatarray.Length);
     
    ms.Position = 0;
    BinaryReader br = new BinaryReader(ms, "ISO-8859-1");
    f = br.ReadSingle();
    br.Close();
    Une méthode analogue pourrait évidement faire la conversion inverse avec BinaryWriter et ms.Read

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 64
    Par défaut
    Merci pour ta réponse, pour MemoryStream c'est ok mais malheureusement la methode BinaryReader n'existe pas dans le micro framework dans le namespace System.IO !
    Domage!

    j'ai essayé de le faire en sens inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    fake_float = 0;
    unsafe
    {
    fixed (byte* pbyte = &valeur[0])
     {
              fake_float = (*pbyte) | (*(pbyte + 1) << 8) | (*(pbyte + 2) << 16) |          (*(pbyte + 3) << 24); 
    }
    f  = * (float*)&fake_float;
    }
    mais ca plante VS et le harware a cette instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte* pbyte = &valeur[0]
    Je ne vois pas pourquoi ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Par défaut
    Salut, moi j'utilise un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    float numFloat = 0;
    byte[] numBytes = new byte[4];
     
    unsafe
    {
    for (int i = 0; i < 4; i++)
    ((byte*)&numFloat)[i] = numBytes[i]; 
    }

Discussions similaires

  1. Conversion implicite byte, short -> float
    Par b_sky dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 14/01/2011, 23h11
  2. Conversion chaine unicode vers float
    Par Nako_lito dans le forum Développement
    Réponses: 3
    Dernier message: 02/09/2008, 14h54
  3. conversion de byte vers string
    Par dalilnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/07/2008, 15h05
  4. [C++] conversion classe string vers float
    Par agrosjea dans le forum C++
    Réponses: 5
    Dernier message: 14/03/2007, 13h45
  5. Conversion d'un byte[] vers un int[]
    Par ludosoft dans le forum Langage
    Réponses: 10
    Dernier message: 11/01/2007, 16h10

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