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 :

convertion valeur hexadecimal en decimal


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 74
    Par défaut convertion valeur hexadecimal en decimal
    bonjour,
    voilà mon fichier binaire en hexadecimal :
    A1 A2 A3 A4 BB DD AA FF
    je voudrais lire les 4 premier octet (ecrit en hexadecimal), en decimal !
    la valeur du 4 octet en hexa est lu à partir de la fin !
    c.à.d :
    hex(A4 A3 A2 A1) = ? (decimal)
    voilà ou je suis :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, char ** argv) {
    FILE *infile;
    FILE *outfile;
    int i=0;
    if ((infile = fopen(argv[1], "rb")) == NULL)
    {
    fprintf(stderr, "Pb ouverture infile !\n");
    return(EXIT_FAILURE);
    }
    if(!fread(&i,1,4, infile))
    {
    fprintf(stderr,"fread header Failure !\n");
    return(EXIT_FAILURE);
    }
    printf("%d\n",i);
    return(EXIT_SUCCESS);
    }
    la resultat ne convient pas !
    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Fais un printf("%lu", i); ces 4 octets forment un usigned long.
    Déclare unsigned long i;
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 74
    Par défaut
    avec :
    printf("%lu", i);
    il fait la convertion directe.
    c.à.d il me donne : le decimal du A1 A2 A3 A4 et non A4 A3 A2 A1 (poids fort/faible).
    NB :
    sur mon pc (debian avec gcc 3.x) ça marche trés bien (resultat = decimal A4A3A2A1).
    mais dans le serveur (HP-UX avec gcc 2.9.x) il fais la convertion directement sans prendre en consideration le poid fort/faible (resultat = decimal A1A2A3A4).[/quote]

  4. #4
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    c'est lorsque tu initialise ton entier i que les 4 octets peuvent être lus dans un ordre différent suivant la notation de la machine (big endian ou little endian)

    dans ton cas particulier, tu n'as qu'a lire les 4 premiers octets les un apres les autres, et "construire" ton entier i a partir de ces 4 octets: ça donne un truc dans le genre:

    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 i=0;
    char c1=0;
    char c2=0;
    char c3=0;
    char c4=0;
     
    fread(&c1,1,1, infile); //c1 contient A1
    fread(&c2,1,1, infile); //c2 contient A2
    fread(&c3,1,1, infile); //c3 contient A3
    fread(&c4,1,1, infile); //c4 contient A4
     
    i=(int)c4+(int)c3*255+(int)c2*255*255+(int)c1*255*255*255;
     
    printf("%d\n",i);
    Comme ça ca devrait marcher dans tous les cas il me semble

  5. #5
    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 Biosox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    i=(int)c4+(int)c3*255+(int)c2*255*255+(int)c1*255*255*255;
     
    printf("%d\n",i);
    Comme ça ca devrait marcher dans tous les cas il me semble
    Tu as testé ? Il faut multiplier par 256, ou mieux, décaler à gauche de 8...

  6. #6
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut oups
    non j'ai pas testé. effectivement c'est par 256 qu'il faut multiplier, désolé. Je voulais surtout donner une idée pour prendre les 4 premiers bytes dans l'ordre, pour le reste je suis allé un peu vite.

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Et à mon avis il faut utiliser (unsigned long) plutôt que (int)
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 74
    Par défaut
    bonjour,
    Merci pour votre aide
    voilà ce que j'ai fait :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, char ** argv) {
    FILE *infile;
    char c1=0;
    char c2=0;
    char c3=0;
    char c4=0;
    unsigned long int i=0;
     
       if ((infile = fopen(argv[1], "rb")) == NULL)
         {
           fprintf(stderr, "Pb ouverture infile !\n");
           return(EXIT_FAILURE);
         }
        fread(&c1,1,1, infile);
        fread(&c2,1,1, infile);
        fread(&c3,1,1, infile);
        fread(&c4,1,1, infile);
        i=(unsigned int)c4+(unsigned int)c3*256+(unsigned int)c2*256*256+(unsigned int)c1*256*256*256;
        printf("%lu\n",i);
        return(EXIT_SUCCESS);
    }
    si dans mon fichier IN j'ai :
    90 02 00 00
    résultat :
    2416050176 // valeur en hex de 90 02 00 00 et non 00 00 02 90 !!
    sur mon pc (debian avec gcc 3.x) ça marche trés bien (resultat = decimal A4A3A2A1) avec ce programme :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, char ** argv) {
    FILE *infile;
    FILE *outfile;
    int i=0;
    if ((infile = fopen(argv[1], "rb")) == NULL)
    {
    fprintf(stderr, "Pb ouverture infile !\n");
    return(EXIT_FAILURE);
    }
    if(!fread(&i,1,4, infile))
    {
    fprintf(stderr,"fread header Failure !\n");
    return(EXIT_FAILURE);
    }
    printf("%d\n",i);
    return(EXIT_SUCCESS);
    }
    mais dans le serveur (HP-UX avec gcc 2.9.x) il fais la convertion directement sans prendre en consideration le poid fort/faible (resultat = decimal A1A2A3A4) !!

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est normal, sur les serveurs HP-UX, le processeur n'est généralement pas un x86, mais un autre processeur qui n'a pas l'ordre des octets identique.

    Un truc que tu peux faire, c'est tout sauvegarder avec l'ordre des octets "Réseau", qui est le même pour tous.
    Bref, ne pas sauver i, mais htonl(i) (host-to-network-long).
    Et ensuite, quand tu charges, tu fais i=ntohl(variable chargée).

    Sur un x86, htonl et ntohl inversent l'ordre des octets. (htons et noths font la même chose sur des shorts).
    Sur un serveur sous HP-UX, ces fonctions ne font rien.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Transformer un hexadecimal en decimal
    Par funtim78 dans le forum Débuter
    Réponses: 4
    Dernier message: 11/08/2009, 23h02
  2. conversion mot de 4 octets hexadecimal en decimal
    Par adelsunwind dans le forum VBA Access
    Réponses: 7
    Dernier message: 03/03/2009, 22h47
  3. Convertir un hexadecimal en decimal
    Par yann87 dans le forum Débuter
    Réponses: 6
    Dernier message: 24/09/2008, 12h40
  4. Réponses: 6
    Dernier message: 17/05/2008, 03h04
  5. conversion valeur hexadecimal / adresse mémoire
    Par saturne13 dans le forum C
    Réponses: 10
    Dernier message: 04/02/2007, 20h15

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