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 :

Conversion de binaire à hexadécimal


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 92
    Points : 42
    Points
    42
    Par défaut Conversion de binaire à hexadécimal
    Bonjour,
    Je souhaite :
    Lire et convertir un fichier binaire --> en hexadécimal.
    Lire et convertir un fichier hexadécimal --< en binaire.

    Y a-t-il des scripts C qui font celà ?
    J'ai essayé quelques programmes sans succès.

    Merci d'avance.

  2. #2
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonjour,

    Soit t'es sous Windows et il y a HexEdit, soit t'es sous Linux et il y a une commande hexedit <fichier>.

    Sinon, en C (Bin -> Hexa):
    1. Ouvrir ton fichier en mode binaire.
    2. Lire octet par octet.
    3. Afficher l'octet en hexa : printf("%.2Xh", octetLu) ;
    4. Recommencer l'opération en 2 jusqu'à la fin du fichier.
    5. Fermer ton fichier
    (Hexa -> Bin):
    1. Ouvrir ton fichier en mode texte.
    2. Lire deux caractères.
    3. Convertir les deux caractères en binaire sscanf(deuxChar, "%2X", &valeurBin) ;
    4. Afficher la valeur binaire : printf("%d", valeurBin) ;
    5. Recommencer l'opération en 2 jusqu'à la fin du fichier.
    6. Fermer ton fichier
    Si tu n'es pas précis sur ton problème en C, la réponse risque d'être aussi floue que la question.

    Bonne journée
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  3. #3
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Points : 115
    Points
    115
    Par défaut
    Bonjour,

    Citation Envoyé par mlaiti Voir le message
    Je souhaite :
    Lire et convertir un fichier binaire --> en hexadécimal.
    Lire et convertir un fichier hexadécimal --< en binaire.

    Y a-t-il des scripts C qui font celà ?
    J'ai essayé quelques programmes sans succès.
    On ne parle pas de script C mais de code source C.

    Pour synthétiser ce qui est demandé :
    Dans le fichier "binaire" on trouvera des caractères ASCII '0' et '1' qu'on convertira en '0','1',...,'A',...,'F' suivant les nombres qu'ils représentent ?!

    Dans le fichier "hexa" on trouvera les caractères ASCII '0','1','2',...,'A'...'F' qu'on convertira en '0' et '1' suivants les nombres qu'ils représentent ?!

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Citation Envoyé par mlaiti Voir le message
    Bonjour,
    Je souhaite :
    Lire et convertir un fichier binaire --> en hexadécimal.
    Lire et convertir un fichier hexadécimal --< en binaire.

    Y a-t-il des scripts C qui font celà ?
    J'ai essayé quelques programmes sans succès.

    Merci d'avance.
    Salut

    En l'état, on ne pourra pas répondre à ta question, car tu manques de clarté.
    Qu'est-ce que tu appelles un "fichier binaire" et "fichier hexadécimal" ? Ta question, écrite comme cela, ne veut pas dire grand chose. Est-ce qu'il y a des données texte représentant des nombres ? Autre ?

    Sois plus précis.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    Bonjour,
    Merci pour vos réponses.
    Effectivement, c'étai vague. Je fais faire plus simple.


    Mon but est de lire deux caractères par deux caractères d'un fichier, de les convertir en un binaire et enfin de les écrire en BINAIRE dans un fichier de sortie. ( pourquoi 2 caractères par 2 caractères : parce que c'est un fichier hexadecimal, donc pour avoir un OCTET, il faut deux HEXA)

    Exemple :
    var_hexa="2a" --> var_bin="00101010" (= 1 octet)
    Jusque là ça va.
    Mais, là où je bloque :
    comment écrire en mode binaire "00101010" dans un fichier de sortie ?
    càd, que "00101010" soit considéré comme un seul octet et écrit en binaire dans le fichier de sortie. ( et non pas comme 8 caractères).


    Merci beaucoup pour votre réponse.

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ouvre le fichier de sortie en mode écriture binaire et écrit tes données var_bin par fputc()
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char *argv[])
    {
    FILE *out_bin=fopen(argv[1],"wb");
    char *var_bin="00101010";
    fwrite(var_bin,sizeof(var_bin),1,out_bin);
    fclose(out_bin);
    }
    #cc -o copier copier.c
    #./copier ex.bin
    #cat ex.bin
    00101010

    donc, ça marche pas !
    Ou me suis trompée. J'avoue que je ne suis pas habituée à fwrite.

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Dans ton message précédent, tu dis :
    var_hexa="2a" --> var_bin="00101010" (= 1 octet)
    en précisant bien que tu transformes deux caractères hexa en un octet.
    et maintenant tu testes avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *var_bin="00101010";
    var_bin ne fait pas un octet et le codage binaire est sous la forme d'une chaine de caractères !
    Si tu veux tester, tu devrais avoir l'équivalent de
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    Bon, apparemment, j'ai mal décrit mon problème.
    J'ai testé ta proposition.
    char *var_bin="0x2a";
    #cc -o copier copier.c
    #./copier ex.bin
    # cat ex.bin
    0x2a

    Donc, ça marche toujours pas ...

    Peut-être.J'ai mal décrit mon problème.
    Pour faire plus simple :
    J'ai lû à partir d'un fichier binaire un OCTET et l'ai affiché en hexa, il m'a donné "2a". avec fgetc et printf("%.2x",c).
    on est d'accord ?
    Maintenant, je cherche à faire l'opération inverse.
    Voilà, je lis donc les "2a". (je l'ai mis dans une variable pour faire plus simple).
    Je la convertie en binaire. Ce qui donne " 00101010". on est d'accord ?
    Mais, le but est de l'écrire en mode binaire dans un fichier.

    càd : je ne veux pas écrire les 8 chiffres "00101010", mais le binaire dont "2a" est la traduction hexadécimale ...
    De telle sorte à retrouver mon fichier binaire de départ.

    J'espère que mon explication est plus précise ...
    merci d'avance.

  10. #10
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Non, tu n'as pas compris la différence entre une valeur binaire et sa représentation en chaîne de caractères.
    Je n'ai pas écrit :
    mais
    Le premier est l'adresse de début d'une chaine de caractères composée de '0', 'x', '2', 'a', '\0'
    Le second est un entier qui contient la valeur 2a hexadécimale ou si tu préfères la valeur 42 décimale ou si tu préfères la valeur 00101010 binaire

    Si je comprend ton affaire
    1- tu as un fichier en binaire et tu as lu la valeur 0x2a par fgetc() pour la mettre dans la variable var_bin
    2- tu veux écrire ces valeurs dans un fichier pour obtenir un fichier identique à celui de départ : tu n'as qu'à faire fputc() de var_bin. Il n'y a pas besoin de "conversion" de var_bin.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Désolé mais t'es vraiment pas clair.

    Bon, si on résume, t'as un fichier. Tu lis chacun de ses octets, que tu affiches en hexa sur ta console. Il n'y a rien à convertir, puisque ta valeur est déjà contenue dans ta variable "c". La valeur de "c" n'est pas plus décimale, binaire, hexadécimale qu'octale. On représente un nombre avec telle ou telle base pour des raisons d'écriture/de clarté. Mais un nombre, qu'il soit représenté en décimal ou en binaire : c'est pareil. Par exemple, la valeur 0x0a, c'est exactement la même chose que 10 ou que 00001010 (b).

    Maintenant, si tu pars d'une chaine de caractères contenant la représentation hexadécimale (ou d'une autre base) d'un nombre et que tu veux la convertir en nombre, là tu peux utiliser la fonction strtol : http://www.linux-kheops.com/doc/man/.../strtol.3.html . Mais dans ton cas, cela n'a ni queue ni tête car tu possèdes déjà la valeur que tu veux, elle est contenue dans "c".

    C'est pas comme si, par exemple, tu avais un fichier contenant un format tel que, dont tu voudrais convertir chaque valeur XX en un octet. Mais si je comprends bien, tu possèdes un fichier dont chaque octet est une valeur à part entière, tu récupères cette valeur... pour la récrire dans un autre fichier. Il n'y aucune conversion à faire, ce n'est qu'une copie de fichier. Tu dis bien :
    De telle sorte à retrouver mon fichier binaire de départ.
    Donc je comprends pas du tout ta manoeuvre, c'est pas clair du tout...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par diogene Voir le message
    Non, tu n'as pas compris la différence entre une valeur binaire et sa représentation en chaîne de caractères.
    Je n'ai pas écrit :
    mais
    Le premier est l'adresse de début d'une chaine de caractères composée de '0', 'x', '2', 'a', '\0'
    Le second est un entier qui contient la valeur 2a hexadécimale ou si tu préfères la valeur 42 décimale ou si tu préfères la valeur 00101010 binaire

    Si je comprend ton affaire
    1- tu as un fichier en binaire et tu as lu la valeur 0x2a par fgetc() pour la mettre dans la variable var_bin
    2- tu veux écrire ces valeurs dans un fichier pour obtenir un fichier identique à celui de départ : tu n'as qu'à faire fputc() de var_bin. Il n'y a pas besoin de "conversion" de var_bin.


    Ok. Merci beaucoup. Mais, la fwrite ne marche pas apparemment avec la déclaration que tu as donnée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
    FILE *out_bin=fopen(argv[1],"wb");
    char var_bin=0x2a;
    fwrite(var_bin,sizeof(var_bin),1,out_bin);
    fclose(out_bin);
    }
    #cc -o copier copier.c
    copier.c: In function âmainâ:
    copier.c:9: warning: passing argument 1 of âfwriteâ makes pointer from integer without a cast
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fwrite(var_bin,sizeof(&var_bin),1,out_bin);
    fwrite(var_bin,sizeof(*var_bin),1,out_bin);
    Aucune ne marche.

    Désolée, si mes questions sont basiques. ça fait des années que je n'ai pas développer en C et là, j'en ai besoin pour traiter des fichiers.
    Merci pour votre aide.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    Pour Jéroman,
    Dans ce post, j'ai essayé de présenter mon problème d'une manière simplifiée.


    En fait, voilà mon but :
    1) lire un fichier binaire.
    2) le convertir en hexadecimal.( avec printf par exemple)
    3) Modifier le fichier hexadecimal en sortie, par exemple, avec la commande vi.
    4) Générer un nouveau fichier binaire.

    pourquoi passer par l'hexadecimal ?
    Parce que j'ai besoin de la version hexadecimal pour interpréter ce fichier, avec la documentation "hexadecimale" relative à mon logiciel.
    Ensuite, je peux modifier comme je veux avec "vi".
    Mais, mon souci est une fois modifié, comme le regénérer en binaire....


    Voilà. mon besoin.
    Désolée, je ne voulais pas vous encombrer avec tous ces détails.
    Du coup, j'ai simplifié ma demande sur ce post.

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Mais, la fwrite ne marche pas apparemment avec la déclaration que tu as donnée.
    Normal. La fonction est faite pour copier une chaine de caractères. D'où le fait qu'il t'a été conseillé d'utiliser fputc.

    Parce que j'ai besoin de la version hexadecimal pour interpréter ce fichier, avec la documentation "hexadecimale" relative à mon logiciel.
    S'il faut transformer en fichier ayant un format du styleoù x est un caractère hexadécimal (entre 0 et F), tu peux utiliser fprintf : http://www.linux-kheops.com/doc/man/...sprintf.3.html . Utiliser le format "%02x".

    Une fois le fichier généré et modifié, il te suffit de lire deux caractères et de les stocker dans un tableau de caractères (de taille 3, car le dernier élément doit être à '\0'), d'en zapper un si besoin (l'espace). Pour convertir la chaine représentant le nombre hexa en nombre entier, utilise la fonction strtol. Après, tu créées l'autre fichier, tu écris l'octet grâce à fputc.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    Jéroman, merci.
    J'ai passé du temps sur google, mais je me brouille entre les déclarations ...etc
    Voilà où j'en suis, en suivant ce que tu m'as dit
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
    FILE *fin_hex=fopen(argv[1],"r");
    FILE *fout_bin=fopen(argv[2],"wb");
    char c; char tab[2];
    unsigned b;
    int i; char *retour;
     
    i=0;
    while ((c=fgetc(fin_hex))!=EOF)
    {
    i=i+1;
    if ( i==1) tab[0]=c;
    if ( i==2) {
            tab[1]=c; i=0;
            printf("%c%c\n",tab[0],tab[1]);
            b=strtol(tab,&retour,2);
            printf("%c\n",b);
            /* fputc(b,fout_bin); */
            }
    }
    fclose(fout_bin);
    fclose(fin_hex);
    }
    Mais, le dernier affichage est vide printf("%c\n",b);
    Du coup, je ne sais pas, si je dois déclarer "b" autrement que "unsigned" ou bien si j'appelle strtol avec de mauvais arguments. ( c'esty bien le 2 pour convertir au binaire? ).
    Même avec tab[2]='\0', ca donne des lignes vides ...

    Je suis sûre que c'est facile pour vous, moi, il y a beaucoup de notions qui ma manquent ...
    Merci beaucoup d'avance.

  16. #16
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    ...
    copier.c:9: warning: passing argument 1 of âfwriteâ makes pointer from integer without a cast
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fwrite(var_bin,sizeof(&var_bin),1,out_bin);
    fwrite(var_bin,sizeof(*var_bin),1,out_bin);
    Le compilateur signale une erreur sur le premier argument de fwrite(). Pourquoi t'obstines-tu à modifier (n'importe comment) le second ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(&var_bin,sizeof var_bin,1,out_bin);

    1) lire un fichier binaire.
    2) le convertir en hexadecimal.( avec printf par exemple)
    Le principe peut être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      FILE * fb = fopen("a.bin","rb");
      FILE * fh = fopen("a.txt","w");
      unsigned int b;
      while( ( b= fgetc(fb)) != EOF)fprintf(fh, "%2x", b);
      fclose(fh);
      fclose(fb);
    Note : fgetc() retourne un int, pas un char, pour pouvoir faire la différence entre tous les unsigned char possibles et EOF

    3) Modifier le fichier hexadecimal en sortie, par exemple, avec la commande vi.
    4) Générer un nouveau fichier binaire.
    Le principe peut être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      FILE * fh = fopen("a.txt","r");
      FILE * fb = fopen("a.bin","wb");
      unsigned int b;
      while( fscanf(fh,"%2x",&b) ==1) fputc(b,fb);
      fclose(fb);
      fclose(fh);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Citation Envoyé par mlaiti Voir le message
    Jéroman, merci.
    J'ai passé du temps sur google, mais je me brouille entre les déclarations ...etc
    Voilà où j'en suis, en suivant ce que tu m'as dit
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
    FILE *fin_hex=fopen(argv[1],"r");
    FILE *fout_bin=fopen(argv[2],"wb");
    char c; char tab[2];
    unsigned b;
    int i; char *retour;
     
    i=0;
    while ((c=fgetc(fin_hex))!=EOF)
    {
    i=i+1;
    if ( i==1) tab[0]=c;
    if ( i==2) {
            tab[1]=c; i=0;
            printf("%c%c\n",tab[0],tab[1]);
            b=strtol(tab,&retour,2);
            printf("%c\n",b);
            /* fputc(b,fout_bin); */
            }
    }
    fclose(fout_bin);
    fclose(fin_hex);
    }
    Mais, le dernier affichage est vide printf("%c\n",b);
    Du coup, je ne sais pas, si je dois déclarer "b" autrement que "unsigned" ou bien si j'appelle strtol avec de mauvais arguments. ( c'esty bien le 2 pour convertir au binaire? ).
    Même avec tab[2]='\0', ca donne des lignes vides ...

    Je suis sûre que c'est facile pour vous, moi, il y a beaucoup de notions qui ma manquent ...
    Merci beaucoup d'avance.
    J'aurais fait quelque chose comme ç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
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
    	FILE * fin_hex;
    	FILE * fout_bin;
     
    	fin_hex = fopen(argv[1] , "r");
    	if (fin_hex != NULL)
    	{
    		fout_bin = fopen(argv[2] , "wb");
    		if (fout_bin != NULL)
    		{
    			int c; /* int !! */
    			char tab[3]; /* 2 caractères (chiffre hexa) + '\0' */
    			int b;
    			int i;
    			char * retour;
     
    			tab[2] = '\0'; /* Le 3eme caractère doit être '\0' */
    			i=0;
    			while ((c = fgetc(fin_hex)) != EOF)
    			{
    				if (c == '\n' || c == ' ') /* en cas de saut de ligne ou d'un caractère espace */
    					continue;
    				tab[i] = c;
    				if (i == 1)
    				{
    					i = 0;
    					printf("%c%c : " , tab[0] , tab[1]);
    					b = strtol(tab , &retour , 16); /* hexa : base 16 */
    					if (*tab != '\0' && *retour == '\0') /* Il faut vérifier si la conversion a réussi */
    					{
    						printf("%c\n" , (b < 32) ? '.' : b ); /* il faut vérifier s'il s'agit d'un caractère non imprimable lors de l'affichage */
    						fputc(b , fout_bin);
    					} else
    					{
    						printf("\nProbleme lors de conversion valeur\n");
    						break; /* en cas de problème, on stoppe tout */
    					}
    				} else
    					i++;
    			}
    			fclose(fout_bin);
    		}
    		fclose(fin_hex);
    	}
    	return EXIT_SUCCESS;
    }
    Plusieurs remarques :
    * Le tableau doit absolument avoir une taille de 3 (minimum) : deux caractères représentant un nombre hexa à deux chiffres et un caractère terminal ('\0').
    * Il faut toujours vérifier si un fichier a été correctement ouvert.
    * Il ne faut jamais caster le retour de fgetc en char avant de comparer la valeur à EOF. Sinon un caractère correctement lu peut stopper la boucle, car injustement considéré comme ayant la valeur EOF.
    * Il faut vérifier si strtol a réussi sa conversion.
    * Attention à l'affichage des caractères non imprimables, car sinon ça peut parfois effrayer...
    * La fonction "main" doit toujours retourner un entier (soit EXIT_SUCCESS soit EXIT_FAILURE).

    Pour finir, j'ai un peu optimisé ton code et mieux indenté. J'ai rajouté une ligne gérant les éventuels sauts de ligne ou caractères espace entre les chiffres hexa.

    ~~~~~~~

    EDIT:
    Concernant ce que je disais plus haut :
    Normal. La fonction est faite pour copier une chaine de caractères. D'où le fait qu'il t'a été conseillé d'utiliser fputc.
    J'avais mal lu ton code... Il fallait effectivement donner comme premier argument à fwrite l'adresse de la variable.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 92
    Points : 42
    Points
    42
    Par défaut
    ça marche.
    Merci beaucouuuuup.
    Je ne sais pas comment vous remerciez ça m'a tellement aidé.

    Merci encore infiniment et bon week end à tous.

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

Discussions similaires

  1. conversion nombre binaire -> decimal
    Par spoun95 dans le forum Langage
    Réponses: 7
    Dernier message: 25/11/2005, 17h46
  2. [Binaire] Conversion decimal -> binaire sans vecteur
    Par yann1979 dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2005, 16h10
  3. Conversion Texte en Hexadécimal (char*)
    Par kilowat dans le forum C++
    Réponses: 6
    Dernier message: 11/06/2005, 13h40
  4. conversion hexa-binaire
    Par jack69 dans le forum C
    Réponses: 8
    Dernier message: 04/04/2005, 16h33
  5. conversion ip (binaire - decimale)
    Par slim dans le forum Développement
    Réponses: 5
    Dernier message: 13/08/2004, 15h22

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