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.
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.
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):(Hexa -> Bin):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 fichierSi tu n'es pas précis sur ton problème en C, la réponse risque d'être aussi floue que la question.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
Bonne journée
Bonjour,
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 ?!
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.
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.
Ouvre le fichier de sortie en mode écriture binaire et écrit tes données var_bin par fputc()
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.
Dans ton message précédent, tu dis :
en précisant bien que tu transformes deux caractères hexa en un octet.var_hexa="2a" --> var_bin="00101010" (= 1 octet)
et maintenant tu testes avec :
var_bin ne fait pas un octet et le codage binaire est sous la forme d'une chaine de caractères !
Code : Sélectionner tout - Visualiser dans une fenêtre à part char *var_bin="00101010";
Si tu veux tester, tu devrais avoir l'équivalent de
Code : Sélectionner tout - Visualiser dans une fenêtre à part var_bin = 0x2a;
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.
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part char *var_bin="0x2a";
Le premier est l'adresse de début d'une chaine de caractères composée de '0', 'x', '2', 'a', '\0'
Code : Sélectionner tout - Visualiser dans une fenêtre à part char var_bin=0x2a;
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.
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 00 5a 13 08 af .....Tu dis bien :
Donc je comprends pas du tout ta manoeuvre, c'est pas clair du tout...De telle sorte à retrouver mon fichier binaire de départ.
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); }J'ai essayé :#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
Aucune ne marche.
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);
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.
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.
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.Mais, la fwrite ne marche pas apparemment avec la déclaration que tu as donnée.
S'il faut transformer en fichier ayant un format du styleParce que j'ai besoin de la version hexadecimal pour interpréter ce fichier, avec la documentation "hexadecimale" relative à mon logiciel.où 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".
Code : Sélectionner tout - Visualiser dans une fenêtre à part xx xx xx xx xx...
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.
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
Mais, le dernier affichage est vide printf("%c\n",b);
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); }
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.
Le compilateur signale une erreur sur le premier argument de fwrite(). Pourquoi t'obstines-tu à modifier (n'importe comment) le second ?J'ai essayé :...
copier.c:9: warning: passing argument 1 of âfwriteâ makes pointer from integer without a cast
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);
Code : Sélectionner tout - Visualiser dans une fenêtre à part fwrite(&var_bin,sizeof var_bin,1,out_bin);
Le principe peut être1) lire un fichier binaire.
2) le convertir en hexadecimal.( avec printf par exemple)
Note : fgetc() retourne un int, pas un char, pour pouvoir faire la différence entre tous les unsigned char possibles et EOF
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);
Le principe peut être3) Modifier le fichier hexadecimal en sortie, par exemple, avec la commande vi.
4) Générer un nouveau fichier binaire.
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);
J'aurais fait quelque chose comme ça :
Plusieurs remarques :
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; }
* 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 :
J'avais mal lu ton code...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.Il fallait effectivement donner comme premier argument à fwrite l'adresse de la variable.
ça marche.
Merci beaucouuuuup.
Je ne sais pas comment vous remerciez ça m'a tellement aidé.
Merci encore infiniment et bon week end à tous.
Partager