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

Windows Forms Discussion :

[C#2.0] Convertion Byte[] en float


Sujet :

Windows Forms

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Par défaut [C#2.0] Convertion Byte[] en float
    Bonjour, j'ai un probleme pour convertire certaines informations.
    En gros dans mon programme je reçoit une trame sous forme d'un Byte[].
    Je veux construire un float a partir de 2 de ces octects.

    J'arrive a construire un int allant de 0 à 65535 mais je n'arrive pas a comprendre comment faire pour en faire un Float pouvant alllez de -32768 à +32768.

    Je poste le code que j'utilise pour créer un entier :

    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
     
    public static int HexaToInt(Byte[] Buffer, int debut, int longueur)
            {
                int Somme = 0;
                int facteur = 0;
                Char currentCaractere;
                Byte[] WorkingBuffer = new Byte[longueur];
     
                for (int i = 0; i < longueur; i++)
                {
                    WorkingBuffer[i] = Buffer[debut + i];
                }
                String tmpString = TrameToString(WorkingBuffer).Replace(" ","");
                for (int j = tmpString.Length - 1; j >= 0; j--)
                {
                    currentCaractere = tmpString[j];
                    switch (currentCaractere)
                    {
                        case '1': Somme += 1 * puissance(16, facteur); break;
                        case '2': Somme += 2 * puissance(16, facteur); break;
                        case '3': Somme += 3 * puissance(16, facteur); break;
                        case '4': Somme += 4 * puissance(16, facteur); break;
                        case '5': Somme += 5 * puissance(16, facteur); break;
                        case '6': Somme += 6 * puissance(16, facteur); break;
                        case '7': Somme += 7 * puissance(16, facteur); break;
                        case '8': Somme += 8 * puissance(16, facteur); break;
                        case '9': Somme += 9 * puissance(16, facteur); break;
                        case 'A': Somme += 10 * puissance(16, facteur); break;
                        case 'B': Somme += 11 * puissance(16, facteur); break;
                        case 'C': Somme += 12 * puissance(16, facteur); break;
                        case 'D': Somme += 13 * puissance(16, facteur); break;
                        case 'E': Somme += 14 * puissance(16, facteur); break;
                        case 'F': Somme += 15 * puissance(16, facteur); break;
                    }
                    facteur++;
                }
                return Somme;
            }
    Existe t'il un moyen pour caster directement un float Signé ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Byte[] toto = new Byte[2];
    toto[0] = 0x23;
    toto[1] = 0x34;
     
    float LeFlottant = (float)toto; // Marche pas ca serais trop facile
    Need assistance !

  2. #2
    Membre éclairé Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Par défaut
    Salut,

    Je sais pas pour le Framework 2.0, mais en 1.1, le type float est un "alias" du type single.

    T'as essayé de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Single.Parse(tonByteArray)
    ?

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 95
    Par défaut
    Citation Envoyé par Biloutor
    Bonjour, j'ai un probleme pour convertire certaines informations.
    En gros dans mon programme je reçoit une trame sous forme d'un Byte[].
    Je veux construire un float a partir de 2 de ces octects.

    J'arrive a construire un int allant de 0 à 65535 mais je n'arrive pas a comprendre comment faire pour en faire un Float pouvant alllez de -32768 à +32768.
    Salut,

    premièrement une petite remarque :

    Avec 2 octets tu peux faire un int16 (-32768 à 32767) ou un uint16 ( 0 à 65535).

    Pour faire un float il te faut 4 octets.

    Sinon pour pouvoir reconstruire un entier (signé ou non) c'est trés simple : il suffit de décaler le premier octet de 8 et d'ajouter l'autre.

    Si tu souhaite vraiment reconstruire un flottant c'est bien plus compliqué.
    En C++ il y a union qui est trés pratique, en vb ou C# il te faut utiliser :

    StructLayout(LayoutKind.Explicit)

    Exemple : En remplissant les premiers octets, on peut lire les mots ou inversement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [StructLayout(LayoutKind.Explicit)] public struct OctetsVersInt{ 
    [FieldOffset(0)] public byte Octet1; 
    [FieldOffset(1)] public byte Octet2; 
    [FieldOffset(2)] public byte Octet3; 
    [FieldOffset(3)] public byte Octet4; 
    [FieldOffset(0)] public int16 Mot16bits; 
    [FieldOffset(0)] public uint16 MotSigné16bits; 
    [FieldOffset(0)] public float Flottant;}

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Par défaut
    merci pour vos réponse.
    Je ne savais pas qu'il fallait 4 octects pour un float. par contre j'ai bien compris l'utilité des Uint16 et Int16 ce qui est extrêmement pratique.
    J'ai réussi à implémenter les méthodes dont j'avais besoin pour les entier signé ou non signé.
    Après en avoir discuter autour de moi on m'a parler des Union qui sont (d'après ce que j'ai compris) une pseudo structure permettant de voir une donnée sous plusieurs formats différents par exemple Byte[4] et float.

    Il faut que je fasse des recherches sur les "StructLayout(LayoutKind.Explicit)"
    Si tu as des exemple et des tuto je suis prenneur.

    Merci encore.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Par défaut
    Je me suis repencher sur le probleme et ta structure marche super bien.

    Merci beaucoup !

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

Discussions similaires

  1. Conversion 4 bytes vers float
    Par morgan_2956 dans le forum C#
    Réponses: 3
    Dernier message: 10/03/2010, 09h33
  2. Warning convertion long en float
    Par Kalite dans le forum C++
    Réponses: 4
    Dernier message: 15/07/2009, 17h39
  3. convertion string to float
    Par dz_robotix dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 23/04/2008, 15h09
  4. probleme de convertion Bits en Float
    Par L4BiN dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 15/09/2007, 20h52

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