[C] Conversion Hexa vers ASCII

Conversion Hexa vers ASCII [C] - C - Programmation

Marsh Posté le 11-01-2009 à 19:13:24    

Bonsoir,
 
 
Je suis étudiant et dans la réalisation d'un projet, j'aimerai faire un programme qui convertit des valeurs hexadécimal en son équivalent en ASCII, j'aimerai en premier savoir si cela est possible en C (le seule langage que je connais un peu).
 
Si oui, voici comment je pense m'y prendre :
 
/
- Inclure les bibliothèques nécessaires
- Affichage [Entrer les valeurs en hexa]
- Lecture des valeurs
- Effectuer la correspondance
- Affichage de la correspondance
/
 
Mon problème est surtout pour faire la correspondance et réafficher  ensuite cela.
Comment dois je m'y prendre ?
 
 
Merci d'avance

Reply

Marsh Posté le 11-01-2009 à 19:13:24   

Reply

Marsh Posté le 11-01-2009 à 22:51:44    

y a pas de correspondance. Un char c'est un entier. L'affichage n'est qu'une question de formatage, du printf %d ou bien %c

Reply

Marsh Posté le 11-01-2009 à 22:58:47    

Est ce que tu peux développer un peu je comprends pas tout.
En faite en faisant un printf on peut lui dire d'afficher le nombre hexa directement en ascii juste en mettant %qqch, c'est bien ça ?

Reply

Marsh Posté le 11-01-2009 à 23:06:45    

oui

Reply

Marsh Posté le 12-01-2009 à 17:15:24    

Un nombre est un nombre, et pour le C il n'y pas de "nombre hexa". Il y a un nombre, que tu peux afficher en décimal, en octal, en hexadécimal...

Reply

Marsh Posté le 12-01-2009 à 19:39:26    

Bonsoir,
 
Je comprends ce que vous voulez me dire mais je ne sais pas très bien comment le réaliser.
 
Voici le programme que j'ai fait :
 
#include <stdio.h>
#include <stdlib.h>
 
int main (int argc, char *argv[])
{
    char dep[20];
 
    printf("Quel sont les valeurs hexadécimales du block 1 ? " );
    scanf("%x", dep);
    printf("Le conteneur est en partance de %x", dep);
 
    return 0
}
 
 
Quand j'exécute le programme, j'ai toujours la lettre P qui s'affiche =(...
Je ne vois pas ou j'ai fait une erreur ...

Reply

Marsh Posté le 12-01-2009 à 19:40:08    

correction dans le dernier printf j'ai mis %c au lieu de %x.
 
Merci d'avance

Reply

Marsh Posté le 12-01-2009 à 21:05:07    

nan mais là te manques les bases du scanf/printf
 
lire une chaine: fgets
ensuite tu converti en int avec strtol
et après tu printf

Reply

Marsh Posté le 13-01-2009 à 16:35:50    

fgets, j'ai compris comment m'en servir, mais par contre je ne comprends pas pour le strtol ...
 
Voici ce que j'ai pour le strtol :
long strtol( const char *start, char **end, int base );
 
Ce que je pense mettre en const c'est 8 car j'ai 8 lettres/nombres en hexa, après je pense mettre NULL puis pour int base je mettrais 16.
 
Est ce ça ?

Reply

Marsh Posté le 13-01-2009 à 17:14:42    

Voici ce que j'ai fait mais qui ne fonctionne pas :'( :
 
<code>
#include <stdio.h>
#include <stdlib.h>
 
 
 
int main (int argc, char *argv[])
{
    char depart[200];
 
    printf("Quel sont les valeurs hexadécimales du block 1 ? " );
    fgets(depart, sizeof depart, stdin);
    strtol(depart, NULL, 16);
 printf("Le conteneur est en partance de %c", depart);
 
 
}
</code>
 
Ou ai je fait une erreur ?

Reply

Marsh Posté le 13-01-2009 à 17:14:42   

Reply

Marsh Posté le 13-01-2009 à 17:31:54    

Ca veut dire quoi "ça ne fonctionne pas"? C'est trop vague.
Et as-tu bien compris comment fonctionne strtol() ?
De la doc : http://www.cplusplus.com/reference [...] trtol.html


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 13-01-2009 à 17:34:58    

Non je pense ne pas bien comprendre comment utiliser le strtol même avec la documentation est ce que vous pourriez m'expliquer ?
 
Pour moi quand je dis ça ne fonctionne pas, c'est que je n'arrive pas à obtenir la conversion hexadécimal vers ASCII :-( .

Reply

Marsh Posté le 13-01-2009 à 17:42:25    

Vais peut-être dire des conneries, mais ça me fera l'occasion de me faire corriger :jap:

 

Quand tu saisie des caractères hexadécimaux sur l'entrée standard, ça ne correspond à rien d'autre qu'une suite char qui eux-même correspondent à différents nombres qui n'ont à priori pas grand chose à voir avec le nombre héxadécimal que l'on voudrait obtenir.

 

Il est donc essentiel de convertir cette chaîne de caractère en valeur numérique. C'est ce que permet strtol !

 

Exemple : Si tu saisie FF, au mieux tu aura deux fois le code de F alors que tu voudrais 255.


Message édité par dwogsi le 13-01-2009 à 17:45:16

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 13-01-2009 à 17:48:21    

Ok, si je comprends bien, habituellement si je saisie un nombre hexa, il n'a aucune correspondance. Tandis que strtol permet de faire une correspondance. C'est bien ça ?

Reply

Marsh Posté le 13-01-2009 à 18:11:23    

C'est bien ça.
Il ne peut pas y avoir de correspondance puisque tu ne saisie pas un nombre en base 16 mais une chaîne de caractères.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 13-01-2009 à 18:29:59    

Un exemple de conversion :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main (int argc, char *argv[])
  4. {
  5.    char hx[3];
  6.    fgets(hx, sizeof hx, stdin);
  7.    long res = strtol(hx, NULL, 16);
  8.    printf("%d", res);
  9. }


Message édité par dwogsi le 13-01-2009 à 18:30:41

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 13-01-2009 à 18:31:13    

Je pense avoir mal compris quelque chose, un nombre en base 16 n'est pas la même chose qu'un nombre hexadécimal ?

Reply

Marsh Posté le 13-01-2009 à 18:32:51    

Les deux termes désignent bien la même chose, même si les puristes diront le contraire.


Message édité par Elmoricq le 13-01-2009 à 19:24:08

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 13-01-2009 à 18:34:53    

Je ne comprends pas bien ta ligne 7 est ce que tu veux ben me l'expliquer s'il te plait ?
 
Le prog convertit de hexa à déci, je vais essayer de faire quelque chose pour que ça convertisse en caractère.


Message édité par Mike0un le 13-01-2009 à 18:38:34
Reply

Marsh Posté le 13-01-2009 à 18:39:36    

Faudrait peut être allez voir les bases du C tu crois pas?
Enfin bon...

 

T'occupe pas du second paramètre de strtol.
Concentre toi sur le premier et le dernier.

 

Il lui faut donc la chaîne saisie par l'utilisateur, ici je me suis limité à une chaîne de 2 caractères (soit 3 avec le caractère de fin de chaîne) ce qui correspond à un octet en notation hexadécimal, soit un char.

 

Il lui faut également la base pour savoir quelle conversion effectuer. Ici 16, ce qui correspond à la notation hexadécimale.

 

A partir de ces deux paramètre, elle renvoie la valeur traduite sous forme numérique, contenue dans une variable du bon type. Ici de type long. Que l'on récupère dans res.

 

Pour ensuite obtenir le caractère c'est simple : printf("%c",res);


Message édité par dwogsi le 13-01-2009 à 18:41:22

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 13-01-2009 à 18:42:04    

Merci beaucoup de tes explications, tu m'as beaucoup aidé.
 
Merci encore


Message édité par Mike0un le 13-01-2009 à 18:43:12
Reply

Marsh Posté le 13-01-2009 à 18:44:50    

Commence par consulter une table ASCII (google est ton ami).

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main (int argc, char *argv[])
  4. {
  5.    int res[] = {65,66,67};
  6.    printf("%c,%c,%c", res[0],res[1],res[2]);
  7. }


ça donne A,B,C

 

Edit : Ah bah si tu change tes messages.... :o


Message édité par dwogsi le 13-01-2009 à 18:45:18

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 13-01-2009 à 18:50:18    

D'accord, j'essaye de faire quelque chose qui convertit plusieurs caractères et je t'en fait part.
Oui, excuse moi d'avoir edité mes messages ...

Reply

Marsh Posté le 13-01-2009 à 19:11:36    

Voici ce que j'ai fait et qui fonctionne, enfin ...
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main (int argc, char *argv[])
  4.     {
  5.         char block01[3];
  6.         char block11[3];
  7.         char block21[3];
  8.         char block31[3];
  9.         fgets(block01, sizeof block01, stdin);
  10.         long traduc01 = strtol(block01, NULL, 16);
  11.         fgets(block11, sizeof block11, stdin);
  12.         long traduc11 = strtol(block11, NULL, 16);
  13.         fgets(block21, sizeof block21, stdin);
  14.         long traduc21 = strtol(block21, NULL, 16);
  15.         fgets(block31, sizeof block31, stdin);
  16.         long traduc31 = strtol(block31, NULL, 16);
  17.         printf("%c%c%c%c", traduc01, traduc11, traduc21, traduc31);
  18.     }


 
Un grand merci à toi dwogsi, sans toi je n'y serait jamais arrivé.
 
Merci aussi aux autres.


Message édité par Mike0un le 13-01-2009 à 19:12:02
Reply

Marsh Posté le 13-01-2009 à 22:10:50    

J'ai de nouveau un problème. Voici mon programme :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main (int argc, char *argv[])
  4.     {
  5.         char block100[3];
  6.         char block110[3];
  7.         char block120[3];
  8.         char block130[3];
  9.         char block200[3];
  10.         char block210[3];
  11.         char block220[3];
  12.         char block230[3];
  13.         char block300[3];
  14.         char block310[3];
  15.         char block320[3];
  16.         char block330[3];
  17.         printf("Entrer les valeurs hexadecimales du block 1\n" );
  18.         fgets(block100, sizeof block100, stdin);
  19.         long traduc100 = strtol(block100, NULL, 16);
  20.         fgets(block110, sizeof block110, stdin);
  21.         long traduc110 = strtol(block110, NULL, 16);
  22.         fgets(block120, sizeof block120, stdin);
  23.         long traduc120 = strtol(block120, NULL, 16);
  24.         fgets(block130, sizeof block130, stdin);
  25.         long traduc130 = strtol(block130, NULL, 16);
  26.         printf("Le conteneur est en partance de %c%c%c%c \n", traduc100, traduc110, traduc120, traduc130);
  27. //BLOCK N°2
  28.         printf("Entrer les valeurs hexadecimales du block 2\n" );
  29.         fgets(block200, sizeof block200, stdin);
  30.         long traduc200 = strtol(block200, NULL, 16);
  31.         fgets(block210, sizeof block210, stdin);
  32.         long traduc210 = strtol(block210, NULL, 16);
  33.         fgets(block220, sizeof block220, stdin);
  34.         long traduc220 = strtol(block220, NULL, 16);
  35.         fgets(block230, sizeof block230, stdin);
  36.         long traduc230 = strtol(block230, NULL, 16);
  37.         printf("a destination de %c%c%c%c \n", traduc200, traduc210, traduc220, traduc230);
  38. //BLOCK N°3
  39.         printf("Entrer les valeurs hexadecimales du block 3\n" );
  40.         fgets(block300, sizeof block300, stdin);
  41.         long traduc300 = strtol(block300, NULL, 16);
  42.         fgets(block310, sizeof block310, stdin);
  43.         long traduc310 = strtol(block310, NULL, 16);
  44.         fgets(block320, sizeof block320, stdin);
  45.         long traduc320 = strtol(block320, NULL, 16);
  46.         fgets(block330, sizeof block330, stdin);
  47.         long traduc330 = strtol(block330, NULL, 16);
  48.         printf("et contient du %c%c%c%c \n", traduc300, traduc310, traduc320, traduc330);
  49.     }


 
 
Or quand j'exécute mon programme en ligne de commande voici ce que j'obtiens :

Code :
  1. Entrer les valeurs hexadecimales du block 1
  2. 48415652
  3. Le conteneur est en partance de HAVR
  4. Entrer les valeurs hexadecimales du block 2
  5. 486F6E6B
  6. a destination de  Hon
  7. Entrer les valeurs hexadecimales du block 3
  8. 55726169
  9. et contient du k Ur


 
Le k de Honk se retrouve dans ce que contient le conteneur et décale tout.
J'ai loupé un espace ou une mise à la ligne ?

Reply

Marsh Posté le 13-01-2009 à 22:32:29    

fgets lis une ligne. Pour ce que tu veux faire, tu dois:
- lire une ligne avec fgets (genre au moins 80c)
- former des groupes de 2c et les passer à strtol

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed