bonsoir a tous,
comment passer du code ascii au code decimal avec le language c?
mérci
-----
bonsoir a tous,
comment passer du code ascii au code decimal avec le language c?
mérci
Bonsoir
Je pense que cette question n'est pas dans la bonne rubrique. Ici on traite plus les questions d'électronique que d'informatique.
Quand tu évoques le « code décimal », j'imagine que tu parles du codage BCD (Binary Coded Decimal) des chiffres de 0 à 9.
Les codes ASCII des chiffres de 0 à 9 vont respectivement de 48 à 57 (de 30h à 39h en hexadécimal). Il suffit donc de retrancher 48 (soit 0x30 ou '0' en langage C) au code ASCII du chiffre traité pour obtenir son code BCD. Le code source correspondant est :
Bien entendu, seuls les 4 bits de poids faible du résultat sont significatifs.Code:code_BCD = code_ASCII - '0';
Bonsoir marco05 et tout le groupe
C'est vrai que ceci est une manière d'écrire. Bien entendu, il convient, au préalable, de vérifier que le code ascii est dans la fourchette numérique, sinon le résultat risque de poser de sérieux problèmes.
Comme on nous dit pas ce qui est à convertir, au juste, il peut y avoir des décimales, probablement séparées par un point.
Comme on ne sait pas non plus de quel C il s'agit, on peut utiliser les fonctions ad hoc, comme par exemple itoa(int); qui est la réciproque du atoi(*char);
Il y a la série pour tous les types de nombres.
voila je sois un nembre de 3 chiffres en ascii que je voudrai convertir en decimal
Il faudrait quand même que tu précises ce que tu entends par « décimal ». J'ai fait l'hypothèse que tu parlais de code BCD qui, pour un seul chiffre ne pose pas de problème d'interprétation ni de conversion.
En revanche, si tu souhaites convertir un nombre (de plusieurs chiffres, donc), les traitements nécessaires vont dépendre de la manière dont sont stockés ces chiffres BCD (codés sur 4 bits, je le rappelle, alors que les éléments traités par défaut par le langage C occupent un multiple de 8 bits).
le plus simple est d'utiliser la fonction sscanf() qui permet entre autres de convertir directement une chaine en entier.
A+
Tu as raison, mais du coup, je réalise que j'ai, moi aussi, proposé du binaire.
Pourtant, je ne vois pas très bien, maintenant que tu nous "ouvres les yeux", ce que le décimal vient faire dans cette galère.
Car enfin, l'ASCII, c'est bien du décimal.
Je crois bien que pour progresser dans cette discussion, il est indispensable que marco05 nous dise clairement ce qu'il cherche.
Edit: peut-être est-ce cela qu'il cherche: ayant une chaîne de 3 caractères ASCII, représentative du nombre, il veut le convertir en BCD.
C'est donc comme tu l'as dit (ASCII - '0'), à faire caractère après caractère, et à "ranger" dans le même ordre, pour reconstituer la séquence des 3 caractères BCD.
Dernière modification par gienas ; 13/11/2009 à 22h10.
A ce moment là, tout est binaire dans l'ordi.sscanf() convertit une chaîne ASCII en une valeur binaire.
Or, a priori c'est un code décimal qui est recherché ici.
Ce que je pense: on a une chaine constituée de chiffres:
char nombreASCII[10]="123";
int n;
sscanf(nombreASCII,"%d",&n);
printf("%d",n+1); // affiche 124
nombreASCII est bien constitué de codes ASCII et n'a aucune valeur numérique.
n est bien un nombre, puisque j'ai pu lui ajouter 1. Après, on peut l'afficher dans la base que l'on veut.
A+
Non, pas d'accord. Tu confonds codage et représentation d'une valeur. Le premier a une signification physique dans l'ordinateur, alors que la seconde n'est qu'un moyen permettant d'en parler, de l'écrire ou d'y penser.A ce moment là, tout est binaire dans l'ordi.
Ce que je pense: on a une chaine constituée de chiffres:
char nombreASCII[10]="123";
int n;
sscanf(nombreASCII,"%d",&n);
printf("%d",n+1); // affiche 124
nombreASCII est bien constitué de codes ASCII et n'a aucune valeur numérique.
n est bien un nombre, puisque j'ai pu lui ajouter 1. Après, on peut l'afficher dans la base que l'on veut.
A+
Sur un ordinateur, tout est codé en binaire, c'est-à-dire à l'aide de deux symboles, puisque la machine ne fonctionne qu'avec deux niveaux électriques (à l'exception de certains rares organes qui fonctionnent en fait sur un nombre plus importants de niveaux, mais qui sont tout de même exploités extérieurement en binaire). Pour autant, cela correspond rarement à un codage décimal.
Dans ton exemple, sscanf() transforme la chaîne "123" en un entier sur 16 bits (ou 32 bits pour certains compilateurs) représentant la valeur 123. La mémoire correspondant à cet entier contient au final les bits :
¨¨¨¨ 0000000001111011
(note que la représentation binaire que j'utilise ici correspondant directement à l'état physique des circuits électroniques).
On peut représenter ce contenu par 123 en décimal, mais aussi 1111011 en binaire, 173 en octal, 7B en hexadécimal, ou encore 11120 en base 3. Mais il ne s'agit là que de représentation, pas de codage.
Le codage suggère l'emploi d'un système de symboles représentatifs, dont le nombre est égal à dix dans le cas du codage décimal. Et comme on est sur un ordinateur, chacun de ces symboles est à son tour codé en binaire.
Dans le cas présent, la valeur 123 n'est pas codée en décimal : dans la mémoire contenant l'entier, on ne peut pas retrouver les symboles codant le 1 des centaines, le 2 des dizaines et le 3 des unités. En fait, la valeur n'est pas codée dans un autre système que celui utilisé par défaut par l'ordinateur, c'est-à-dire le binaire.
En revanche, comme l'indiquait gienas juste au dessus, on peut considérer que, pour les nombres entiers représentés en base 10, l'ASCII peut constituer un codage décimal. Les dix symboles utilisés sont :
¨¨¨¨ 00110000 ('0' ou 0x30)
¨¨¨¨ 00110001 ('1' ou 0x31)
¨¨¨¨ 00110010 ('2' ou 0x32)
¨¨¨¨ 00110011 ('3' ou 0x33)
¨¨¨¨ 00110100 ('4' ou 0x34)
¨¨¨¨ 00110101 ('5' ou 0x35)
¨¨¨¨ 00110110 ('6' ou 0x36)
¨¨¨¨ 00110111 ('7' ou 0x37)
¨¨¨¨ 00111000 ('8' ou 0x38)
¨¨¨¨ 00111001 ('9' ou 0x39)
Ainsi la chaîne "123" est stockée en mémoire sous la forme :
¨¨¨¨ 00110001 00110010 00110011 00000000
dans laquelle on retrouve bien distinctement les symboles représentatifs du 1, du 2 et du 3 (le dernier symbole n'est là que pour indiquer la fin de la chaîne, et n'a pas de signification dans le système de codage du nombre).
J'ai quant à moi évoqué le codage décimal BCD, qui utilise les symboles suivants :
¨¨¨¨ 0000 (0)
¨¨¨¨ 0001 (1)
¨¨¨¨ 0010 (2)
¨¨¨¨ 0011 (3)
¨¨¨¨ 0100 (4)
¨¨¨¨ 0101 (5)
¨¨¨¨ 0110 (6)
¨¨¨¨ 0111 (7)
¨¨¨¨ 1000 (8)
¨¨¨¨ 1001 (9)
Dans ce système de codage, la valeur 123 donnera :
¨¨¨¨ 0001 0010 0011
qui pourra être stocké en mémoire dans un entier (int) sous la forme :
¨¨¨¨ 0000000100100011
dans laquelle on retrouve toujours bien distinctement les symboles représentatifs du 1, du 2 et du 3.
Mais on peut également envisager de la stocker dans trois caractères (char) sous la forme :
¨¨¨¨ 00000001 00000010 00000011
Belle démonstration PA5CAL, mais je n'ai aucun problème avec tout çà et je suis tout à fait d'accord avec ce que tu dis.
En revanche marco05 (qui serait sympa d'intervenir rapidement) est peut-être un peu moins familier avec cette terminologie. Quand il parle de "code décimal", là où gienas et toi y voyez un code BCD, il me semble que marco05 peut simplement vouloir afficher un nombre en décimal.
A+
Dernière modification par Jack ; 14/11/2009 à 15h44. Motif: p'tite faute d'orthographe
Oui, c'est très possible...
Décimal ou pas, j'espère que mon laïus lui donnera quelques clés pour reformuler sa question.
Il n'y a plus qu'à attendre qu'il repasse par ici.
C'est à se demander pourquoi on essaie d'aider quand on voit l'intérêt porté par certains participants
aucun !
les forums sont considérés par certains comme un supermarché, jettent une question en "copié collé" sur un maximum de sites , prennent la premiére réponse et disparaissent.
En gros un " faismesdevoirs.com" gratuit tenu par des bénévoles, dont beaucoup se lassent, et installent des forum privés (comme les groupes de discussions Yahoo)
notre ami marco05 est passé hier
Dernière activité: Hier 20h16
donc il a lu la réponse #12 de PA5CAL .... et s'est sauvé comme un voleur !