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 chiffre binnaire en chaine de caractère


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut Convertir chiffre binnaire en chaine de caractère
    Bonjour,
    j'ai un tableau : unsigned char TableauTemperature[60][2]
    => 60 : est le nombre de mesure de temperature possible
    => 2 : le chiffre de la température est codé sur 12bit donc j'ai du le séparer en deux (2 x 8bits) (remarque : je programme sous un µC 8bit)

    le codage de la temperature (en °C) se fait se fait comme ça :

    bits de poid forts
    | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
    ---------------------------------------------------
    | sign | 2^6 | 2^5| 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |

    bits de poid faibles
    | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
    ---------------------------------------------------
    | 2^-1 | 2^-2 | 2^-3 | 2^-4 | 0 | 0 | 0 | 0 |

    => comment faire pour convertir cette valeur binaire en chaine de caractère ? (si vous avez pas bien compris mon probleme, n'hesitez pas à me poser des questions)


    en gros, je veux recupérer les valeur des temperatures et les envoyés sur un liaison RS232 sous cette forme : 10.2, 10.5, 11.0, ...

  2. #2
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    Tu désires afficher les bits ou la valeur décimale?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    la valeur decimale (en caratère ASCII pour la liaison RS232)

  4. #4
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    => comment faire pour convertir cette valeur binaire en chaine de caractère ? (si vous avez pas bien compris mon probleme, n'hesitez pas à me poser des questions)
    Tu devrais utiliser la fonction sprintf qui convertit un nombre en chaine de caractères.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    le codage de la valeur binaire n'est pas standard

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Salut,

    Citation Envoyé par Emcy
    le codage de la valeur binaire n'est pas standard
    Il faut commencer par convertir ta suite de bits en nombre (avec ton premier post tu as déjà la moitié de l'algo), et ensuite tu utilise sprintf pour convertir ton nombre en chaîne de caractères

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    comment est codé un float (c'est pour faire la conversion) ?

  8. #8
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    comment est codé un float (c'est pour faire la conversion) ?
    Tu parles de la conversion de float vers une chaine de caractères?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Emcy
    comment est codé un float (c'est pour faire la conversion) ?
    Pas besoin. Ton compilateur sait le faire.

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float v = (float)(256*(signed char)TableauTemperature[i][0] + TableauTemperatur[i][1])/256
    Si tu ne veux pas utiliser de flottants,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long v = ((16L*(signed char)TableauTemperature[i][0] + TableauTemperatur[i][1]/16)*100+8)/16;
    tu convertis avec sprintf et tu ajoutes une virgule avant les deux derniers chiffres.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Emcy
    bits de poid forts
    | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
    ---------------------------------------------------
    | sign | 2^6 | 2^5| 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |

    bits de poid faibles
    | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
    ---------------------------------------------------
    | 2^-1 | 2^-2 | 2^-3 | 2^-4 | 0 | 0 | 0 | 0 |

    => comment faire pour convertir cette valeur binaire en chaine de caractère ? (si vous avez pas bien compris mon probleme, n'hesitez pas à me poser des questions)

    en gros, je veux recupérer les valeur des temperatures et les envoyés sur un liaison RS232 sous cette forme : 10.2, 10.5, 11.0, ...
    Il faut regrouper les bits selon la spec.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       double x = 
                     /* partie entiere (sans le signe) */
                     (tab[i][0] & 0x7F) 
                     /* partie decimale */
                  + ((tab[i][1] >> 4) / 16.0); /* EDIT */
     
       /* on suppose sign = 1 : negatif) */
       if (tab[i][0] & 0x80)
       {
          x *= -1;
       }
       printf ("%.2f\n", x);
    C'est un peu ésotérique. Il faut connaître les opérateurs bits (indispensable en embarqué...)

  12. #12
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Il faut regrouper les bits selon la spec.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       double x = 
                     /* partie entiere (sans le signe) */
                     (tab[i][0] & 0x7F) 
                     /* partie decimale */
                  + ((tab[i][1] >> 4) / 10000.0);
     
       /* on suppose sign = 1 : negatif) */
       if (tab[i][0] & 0x80)
       {
          x *= -1;
       }
       printf ("%.2f\n", x);
    C'est un peu ésotérique. Il faut connaître les opérateurs bits (indispensable en embarqué...)
    Il faut remplacer 100000.0 par 16.0 ou alors j'ai pas bien compris les specs et elles me semblent avoir peu de sens.

    A propos de specs, il y a une différence entre la manière dont Emmanuel a interprété le signe et moi. Peut-être parce que le convertisseur que j'ai utilisé il y a longtemps fonctionnait ainsi, j'ai pris du complément à deux (et j'ai oublié de l'appliquer à la partie fractionnaire, ce qui est un problème); Emmanuel a considéré que c'était grandeur et signe.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Il faut remplacer 100000.0 par 16.0 ou alors j'ai pas bien compris les specs et elles me semblent avoir peu de sens.
    Ah oui, zut, ce ne sont que des bits et pas des décimaux... Je corrige.

    Merci.

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    pour la partie decimal, ne serait ce pas plus efficace cette methode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 625 = 1 + 16 + 32 + 64 + 512
    int partie_apres_virgule(lsb)
    {
     
           if (lsb != 0)
           {
                lsb>=4;
     
                 return (lsb + lsb<<4 + lsb<<1 + lsb<<1 + lsb<<3);
           }
           else{
                  return 0;
           }
    }

    qu'est-ce qui s'execute le plus rapidement ?

    ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (lsb + lsb<<4 + lsb<<1 + lsb<<1 + lsb<<3);
    ou ça :

  15. #15
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emcy
    qu'est-ce qui s'execute le plus rapidement ?

    ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (lsb + lsb<<4 + lsb<<1 + lsb<<1 + lsb<<3);
    ou ça :
    D'abord, je ne comprends pas ta logique de calcul.
    Ensuite, ta décomposition n'est pas celle de 625.
    Enfin, si elle est plus rapide, il y a des chances que le compilateur l'utilise tout seul, ou alors une autre avec des soustractions qui sera plus rapide encore... (15= 16-1 pluôt que 15=1+2+4+8)

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

Discussions similaires

  1. Convertir un entier en chaine de caractères
    Par zuzuu dans le forum Langage
    Réponses: 2
    Dernier message: 06/12/2008, 11h12
  2. Réponses: 11
    Dernier message: 03/09/2008, 10h41
  3. Convertir une variable en chaine de caractères
    Par Sytchev3 dans le forum Langage
    Réponses: 2
    Dernier message: 03/10/2007, 11h48
  4. Réponses: 4
    Dernier message: 16/05/2006, 21h03

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