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 :

équivalent de eval('0x' + 6B) en C ?


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Par défaut équivalent de eval('0x' + 6B) en C ?
    Bonjour,

    Pour faire court tout est dans le titre : j'aimerais savoir comment coder l'équivalent de eval('0x' + 6B) en C.

    Dans un programme python je doit lire un fichier avec des nombres hexadécimaux par exemple :
    71
    6C
    8D

    Pour la lisibilité je fais eval('0x' + nombre_hexa) pour systématiquement à la lecture de chaque nombres et donc j'obtiens :
    0x71
    0x6C
    0x8D

    Aujourd'hui j'essaie d'adapter mon programme en C et je ne sais pas comment faire ça.

    Merci d'avance pour vos réponses !

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    si ton fichier contient les chaînes 71 6C 8D, alors au lieu d'utiliser certainement un printf("%s\n", buffer); utilise un printf("0x%s\n", buffer);.
    si en revanche ton fichier contient les caractères de code ascii 71,6C,8D alors un printf("%#x\n", (unsigned int) c); pourrait faire l'affaire.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Hello,

    Citation Envoyé par Self-Mao Voir le message
    Pour faire court tout est dans le titre : j'aimerais savoir comment coder l'équivalent de eval('0x' + 6B) en C. Merci d'avance pour vos réponses !

    Le plus simple, lorsque le curseur de ton fichier est exactement au dessus de tes chiffres hexadécimaux, consiste à utiliser « scanf("%2x",&x); ». Dans cet exemple, « %x » indique que tu cherches à lire un code hexadécimal et « x » est une variable de type unsigned int qui va recevoir le résultat. « &x » est une expression qui signifie « adresse de x », de manière à ce que scanf() puisse aller directement déposer le résultat dans la variable en mémoire.

    Le « 2 » inséré au milieu de « %x » indique que la chaîne à lire fera au maximum deux caractères de long et qu'il n'ira pas plus loin. C'est utile si tu as une série de caractères hexadécimaux consécutifs sans séparateur.

    L'autre solution consiste à charger tes deux caractères en mémoire dans un petit tableau et d'utiliser strtol() en spécifiant explicitement la base 16. Ça t'oblige à charger d'abord les caractères à la main (ou la ligne entière dans un buffer, si tu le peux) mais c'est autrement plus simple à manipuler que scanf().

    Enfin, tu peux aussi décoder toi-même la valeur de ces codes, mais c'est un peu pénible parce qu'il faut vérifier manuellement que le caractère lu est bien compris soit entre « 0 » et « 9 », soit entre « A » et « F » (en majuscules), soit entre « a » et « f » (en minuscules).

    Citation Envoyé par kwariz Voir le message
    Bonjour,

    si ton fichier contient les chaînes 71 6C 8D, alors au lieu d'utiliser certainement un printf("%s\n", buffer); utilise un printf("0x%s\n", buffer);.
    si en revanche ton fichier contient les caractères de code ascii 71,6C,8D alors un printf("%#x\n", (unsigned int) c); pourrait faire l'affaire.
    Ce n'est pas très clair mais je pense qu'il cherche à obtenir la valeur numérique représentée par ses codes hexadécimaux à deux chiffres (sans 0x). En tout cas, c'est ce que donnerait « eval('0x' + code); » dans un langage symbolique comme le Shell ou le PHP, et dans tout langage interprété pouvant concaténer facilement des chaînes…

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    J'ai du mal à comprendre le résultat attendu.

    En Python, tu ne peux pas ajouter un int et une str :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> nbr = 71
    >>> eval('0x' + nbr)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: cannot concatenate 'str' and 'int' objects
    Ou simplement avec l'exemple de Self-Mao :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> eval('0x' + 6B)
      File "<stdin>", line 1
        eval('0x' + 6B)
                     ^
    SyntaxError: invalid syntax
    Je présume donc que nombre_hexa est une chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> nbr = '71'
    >>> eval('0x' + nbr)
    113
    >>> hex(113)
    '0x71'
    Mais ce n'est pas encore avec le résultat attendu, qui est :
    0x71   0x6C   0x8D
    Si on veut simplement obtenir une chaine, je ferai ça mais eval() disparait de la circulation ^^ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> '0x'  +  str(71) 
    '0x71'
    Self-Mao, pourrais-tu clarifier ton problème stp ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Par défaut
    En effet, j'avoue que ce n'était pas très clair.

    En fait je me suis trompé car mon programme python (que j'ai fait il y a 2 ans) ne faisait pas vraiment ce que je pensais qu'il faisait.

    En réalité il convertie simplement les nombres lus comme chaîne dans le fichier en base 16.
    Comme l'a montré Bktero :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> eval('0x' + 'AC')
    172
    Donc dans mon programme C j'ai utilisé strtol() pour faire la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strtol("nb", NULL, 16);
    Il me semblait que le programme traitait le fichier autrement mais en fait non c'est plus simple que ce que je pensais.

    Merci à vous pour votre aide, en tous cas !

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

Discussions similaires

  1. équivalent de eval en asp
    Par shadokman dans le forum ASP
    Réponses: 2
    Dernier message: 21/04/2006, 11h26
  2. [String] équivalent de la fonction eval() en javascript
    Par jeyce dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 01/09/2004, 08h42
  3. Réponses: 3
    Dernier message: 21/08/2003, 14h47
  4. [postgreSQL] équivalent de la function 'instr'
    Par Dra_Gun dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2003, 16h09
  5. Équivalent du #IFDEF
    Par agh dans le forum Langage
    Réponses: 4
    Dernier message: 14/10/2002, 18h44

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