Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3110 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Conversion Hexa vers ASCII

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Conversion Hexa vers ASCII

n°1836639
Mike0un
Posté le 11-01-2009 à 19:13:24  profilanswer
 

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

mood
Publicité
Posté le 11-01-2009 à 19:13:24  profilanswer
 

n°1836690
Taz
bisounours-codeur
Posté le 11-01-2009 à 22:51:44  profilanswer
 

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

n°1836691
Mike0un
Posté le 11-01-2009 à 22:58:47  profilanswer
 

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 ?

n°1836697
Taz
bisounours-codeur
Posté le 11-01-2009 à 23:06:45  profilanswer
 

oui

n°1836993
matafan
Posté le 12-01-2009 à 17:15:24  profilanswer
 

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...

n°1837063
Mike0un
Posté le 12-01-2009 à 19:39:26  profilanswer
 

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 ...

n°1837064
Mike0un
Posté le 12-01-2009 à 19:40:08  profilanswer
 

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

n°1837089
Taz
bisounours-codeur
Posté le 12-01-2009 à 21:05:07  profilanswer
 

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

n°1837428
Mike0un
Posté le 13-01-2009 à 16:35:50  profilanswer
 

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 ?

n°1837464
Mike0un
Posté le 13-01-2009 à 17:14:42  profilanswer
 

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 ?

mood
Publicité
Posté le 13-01-2009 à 17:14:42  profilanswer
 

n°1837497
dwogsi
Défaillance cérébrale...
Posté le 13-01-2009 à 17:31:54  profilanswer
 

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})/
n°1837503
Mike0un
Posté le 13-01-2009 à 17:34:58  profilanswer
 

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 :-( .

n°1837511
dwogsi
Défaillance cérébrale...
Posté le 13-01-2009 à 17:42:25  profilanswer
 

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})/
n°1837513
Mike0un
Posté le 13-01-2009 à 17:48:21  profilanswer
 

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 ?

n°1837531
dwogsi
Défaillance cérébrale...
Posté le 13-01-2009 à 18:11:23  profilanswer
 

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})/
n°1837543
dwogsi
Défaillance cérébrale...
Posté le 13-01-2009 à 18:29:59  profilanswer
 

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})/
n°1837544
Mike0un
Posté le 13-01-2009 à 18:31:13  profilanswer
 

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

n°1837546
dwogsi
Défaillance cérébrale...
Posté le 13-01-2009 à 18:32:51  profilanswer
 

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})/
n°1837549
Mike0un
Posté le 13-01-2009 à 18:34:53  profilanswer
 

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
n°1837551
dwogsi
Défaillance cérébrale...
Posté le 13-01-2009 à 18:39:36  profilanswer
 

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})/
n°1837552
Mike0un
Posté le 13-01-2009 à 18:42:04  profilanswer
 

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


Message édité par Mike0un le 13-01-2009 à 18:43:12
n°1837554
dwogsi
Défaillance cérébrale...
Posté le 13-01-2009 à 18:44:50  profilanswer
 

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})/
n°1837555
Mike0un
Posté le 13-01-2009 à 18:50:18  profilanswer
 

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 ...

n°1837558
Mike0un
Posté le 13-01-2009 à 19:11:36  profilanswer
 

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
n°1837597
Mike0un
Posté le 13-01-2009 à 22:10:50  profilanswer
 

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 ?

n°1837605
Taz
bisounours-codeur
Posté le 13-01-2009 à 22:32:29  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Conversion Hexa vers ASCII

 

Sujets relatifs
B. Stroustrup - Programming: Principles and Practice Using C++[C / OpenGL] Comment faire un deplacement libre (si possible: freefly
Pourquoi ne pas pointer vers un élément courant dans une liste chainée[C] Savoir si un type de fichier est présent dans un répertoir
[C]programme affichant la suite d'operation pour trier une liste.Importation des données depuis SQL vers EXCEL
[C] boucle de lecture streaming audio[Résolu][C] probleme avec une macro
[HELP] Communiquer en C/C++ avec des API Siemens S5Erreur dans un programme basique en C
Plus de sujets relatifs à : [C] Conversion Hexa vers ASCII


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR