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 :

Transformer un grand hexa en numérique


Sujet :

C

  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut Transformer un grand hexa en numérique
    (re) bonjour,

    Hé oui, c'est la journée du traitement de chaines, hi.

    Ce coup-ci, j'ai de l'hexa sur 12 caractères que je veux convertir en numérique: 009064F00000.
    J'ai essayé: strtoul(strTmp,NULL,16); mais ça renvoie un long, ce qui n'est pas asser long pour stocker le résultat.

    J'ai transformé une fonction que j'ai trouvée:
    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
    //Conversion de base n en dec 
    double BaseNToDec(char *TablDep, int inBase) { 
       double inTotal=0;
       int i=2,Valeur,inValTabl;
       float flPuissance;
     
       while(TablDep[i]!=0) {
          flPuissance = pow(inBase,(strlen(TablDep)-i-1));
          inValTabl = TablDep[i];
          Valeur = (inValTabl-48)*flPuissance;
          inTotal += Valeur;
          i++;
       }
       return inTotal;
    }
    Mais si je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    code = BaseNToDec(strTmp,16);
    printf("(%ld)(%lf)",code,code);
    Ca me renvoie: (0)(2.000001)

    Quelqu'un peut-il m'aider ?

    Merci d'avance.

  2. #2
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Salut,

    J'ai fait exactement cette fonction mais dans un autre langage (OCaml, je te le conseille si tu le connais car son module Big_int te permet d'avoir des clefs aussi grandes que tu veux..).
    Bref moi j'avais traiter la chaine caractère par caractère. C'est pas bien difficile.
    Utilise le type long long int.

  3. #3
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Heuuuu.

    Peux tu développer STP.

  4. #4
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Disons que ta chaine hexa c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    machaine[64] = "F5EDA6";
    L'entier lui correspondant est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    6*16^0 + 10*16^1 + 13*16^2 + 14*16^3 + 5*16^4 + 15*16^5
    Dans une boucle, tu parcours ta chaine, tu prend chaque caractère, tu le multiplie par la puissance de 16 correspondant.
    Attention si tu fais directement :
    il ne va pas prendre 15 mais le code ascii de F, à toi de changer ça...soit avec un switch, soit en bricolant

  5. #5
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Je me suis inspiré de ton post et j'ai fait ça:
    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
    //Conversion de base n en dec 
    double hexToDec(char *TablDep) { 
       double inTotal=0;
       char strTmp[2]="";
       long tmp;
       int i;
     
       for (i=0;i<strlen(TablDep);i++) {
          strTmp[0] = TablDep[i];
          tmp = strtoul(strTmp,NULL,16); // Stocker le code en numérique
          inTotal += tmp;
          printf("(%s)(%d)(%.0f)",strTmp,tmp,inTotal); 
       }
       return inTotal;
    }
    Ce n'est pas très optimisé mais le problème est que inTotal ne s'incrémente pas, il reste à 0 (voire -1 et il revient à 0)

  6. #6
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Moi j'ai fait ça en 3min :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
     
    int main()
    {
        char hexa[64] = "45CB1";
        long long int num = 0;
        int i,puissance;
        int taille = strlen(hexa);
     
        puissance = taille - 1;
        for(i=0;i<taille;i++)
        {
         switch(hexa[i])
         {
          case '1' : num += 1*pow(16,puissance); break;
          case '2' : num += 2*pow(16,puissance); break;
          case '3' : num += 3*pow(16,puissance); break;      
          case '4' : num += 4*pow(16,puissance); break;
          case '5' : num += 5*pow(16,puissance); break;
          case '6' : num += 6*pow(16,puissance); break;
          case '7' : num += 7*pow(16,puissance); break;
          case '8' : num += 8*pow(16,puissance); break;
          case '9' : num += 9*pow(16,puissance); break;
          case 'A' : num += 10*pow(16,puissance); break;
          case 'B' : num += 11*pow(16,puissance); break;
          case 'C' : num += 12*pow(16,puissance); break;
          case 'D' : num += 13*pow(16,puissance); break;
          case 'E' : num += 14*pow(16,puissance); break;
          case 'F' : num += 15*pow(16,puissance); break;
         }
         puissance--;
        }
        printf("%lld\n",num);
        system("pause");
        return 0;
    }
    Je sais pas si c'est ce que tu souhaites.
    En tout cas ça fonctionne pour des chaines hexa pas tres grandes, car apres le type long long int est depassé

  7. #7
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Le problème, c'est quemon compilateur ne connait pas le type long long int.

    C'est du C propriétaire.

    Il va donc me falloir jouer avec du double et je ne maitrise pas son comportement.

    (Je viens de me rendre compte que ma fonction, c'est n'importe quoi)

  8. #8
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par dacid
    Le problème, c'est quemon compilateur ne connait pas le type long long int.

    C'est du C propriétaire.

    Il va donc me falloir jouer avec du double et je ne maitrise pas son comportement.
    Aie mince, essaye le unsigned long..

    Edit : le type double peut coder des nombres plus grands que unsigned long, reste donc en double si la virgule ne te pose pas de souci

  9. #9
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    unsigned long va être trop court (4 octets), et il m'en faut 6 des fois.

    Pas moyen de faire ça en double ?

  10. #10
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par dacid
    unsigned long va être trop court (4 octets), et il m'en faut 6 des fois.

    Pas moyen de faire ça en double ?
    J'ai édité mon post.

    Edit : tu peux faire sauter la virgule à l'affichage :

  11. #11
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Excelent,

    Ca marche, tu es un chef.

    Par contre, j'aurais encore besoin d'aide pour le traitement suivant.

    Faire le modulo d'un grand nombre (la série noire continue).

    Je récupère mon numérique en double: 620168815429

    Et j'aimerais récuperer un modulo. Or C ne veut pas faire de modulo avec autre chose que des int (j'ai essayé unsigned long int mais ca ne passe pas).

    res1 = (code%256);

    J'ai essyé un truc avec modf mais j'ai du mal à comprendre son utilité (elle me renvoie un grand nombre au lieu de 69).

    ps: Je te rassures, je cherche avant de t'ennuyer.

  12. #12
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par dacid
    Faire le modulo d'un grand nombre (la série noire continue).

    Je récupère mon numérique en double: 620168815429

    Et j'aimerais récuperer un modulo. Or C ne veut pas faire de modulo avec autre chose que des int (j'ai essayé unsigned long int mais ca ne passe pas).

    res1 = (code%256);

    J'ai essyé un truc avec modf mais j'ai du mal à comprendre son utilité (elle me renvoie un grand nombre au lieu de 69).
    modf n'a rien à voir avec le modulo :
    modf - Séparer la partie entière et décimale d’un nombre réel.
    Je ne connais pas de fonction faisant un modulo sur un float...mais rien ne t'empeche de la faire.
    C'est pas compliqué..
    res1 = code
    Tant que (res1 > 256)
    res1 = res1 - 256
    FinTantQue
    Je sais pas si ça va etre rapide mais en attendant de trouver une meilleure fonction, ça devrait aller non ?

  13. #13
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    C'est dingue, je dois être maudit !!!

    Pourquoi cette fonction toute bête ne marche pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int modulo(double val, int div) {
       while (val>=div)
          val -= div;
       return (int)val; 
    }
    res1 = modulo(code,256); // Retourne 0
    Difficile de faire plus bête.

  14. #14
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par dacid
    C'est dingue, je dois être maudit !!!

    Pourquoi cette fonction toute bête ne marche pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int modulo(double val, int div) {
       while (val>=div)
          val -= div;
       return (int)val; 
    }
    res1 = modulo(code,256); // Retourne 0
    Difficile de faire plus bête.
    Combien vaut code ? car c'est peut etre un multiple de 256..dans ce cas c'est normal que ça rende 0

  15. #15
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Non, j'ai regardé, elle doit retourner 69.

    Code = 620168815429;

    De plus, mon opération suivante est une division et elle plante aussi:
    reste1 = (long)(((double)code)/256);

    Je croit que les cheveux qui restent sur la tête de mon avatar ne vont pas tarder à disparaitre

  16. #16
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    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
     
    #include <stdio.h>
    #include <string.h>
     
    int modulo(double val, int div) {
       while (val>=div)
          val -= div;
       return (int)val; /* inutile de caster val en int car c'est deja un int => return val;*/
    }
    int main()
    {
      double code = 620168815429.0;
      int res;
     
       res = modulo(code,256);
      	printf("%.lfmodulo256 = %d\n",code,res);
     
      return 0;
    }
    En sortie :
    620168815429modulo256 = 69

  17. #17
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    En fait, il ne répondait pas 0, il ne répondait pas tout court.

    Ce qu'il se passe, c'est qu'il est super long (je ne suis pas sur un pc mais sur un périférique qui a un petit proc).
    Donc cette methode ne convient pas du tout.

    Est ce que prendre ce qu'il y a derriere la virgule d'une division est la même chose, je ne pense pas.

    Je fais un autre post car le problème a changé.
    Merci encore.

  18. #18
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par dacid
    En fait, il ne répondait pas 0, il ne répondait pas tout court.

    Ce qu'il se passe, c'est qu'il est super long (je ne suis pas sur un pc mais sur un périférique qui a un petit proc).
    Donc cette methode ne convient pas du tout.
    Oui en effet c'est tres tres long..
    Tu peux optimiser ta fonction...
    Si ton nombre est >= 2560 au lieu de retrancher 256, tu retranches 2560
    Si il est >= 25600 tu retranches 25600
    etc..

  19. #19
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    J'ai fait ça:
    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
    int modulo(double val, long div) {
       while (val>=div) {
          if (val>div*1000000000) val -= div*1000000000;
          else if (val>div*100000000) val -= div*100000000;
          else if (val>div*10000000) val -= div*10000000;
          else if (val>div*1000000) val -= div*1000000;
          else if (val>div*100000) val -= div*100000;
          else if (val>div*10000) val -= div*10000;
          else if (val>div*1000) val -= div*1000;
          else if (val>div*100) val -= div*100;
          else if (val>div*10) val -= div*10;
          else val -= div;
       }
       return val; 
    }
    Seulement c'est encore trop long, pas moyen de mettre des valeurs supérieures à 1000000000, il me dit "constant too big" lors de la compilation.

  20. #20
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    il doit y avoir un algo beaucoup plus performant pour trouver un modulo, mais je ne le connais pas
    Cherche sur google, ou demande dans le forum d'algo..

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Vxi3] Transformer variable Alpha en variable Numérique
    Par belema56 dans le forum Designer
    Réponses: 6
    Dernier message: 16/12/2010, 10h03
  2. Transformer le point du pavé numérique en virgule
    Par SurfingJeff dans le forum Langage
    Réponses: 4
    Dernier message: 04/11/2008, 10h58
  3. Réponses: 4
    Dernier message: 01/09/2008, 22h00
  4. Réponses: 2
    Dernier message: 09/07/2008, 15h20
  5. ne pas transformer \ en \\ ? & variables hexa-ascii
    Par vincentweb dans le forum Général Python
    Réponses: 8
    Dernier message: 21/07/2006, 22h35

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