Comment faire pour convertir en Hexadécimal en Décimal?
J'ai différentes données hexadécimales sont à venir et stockées dans un entier de type registre.
Lorsque j'utilise fprint je peux voir les suivants:
0x3076
0x307c
.
.
.
Cependant, je tiens à montrer une Virgule version au-dessus de la mention Hex de données comme suit.
12406
12412
.
.
.
En théorie, disons que pour la première valeur, vous effectuez les opérations suivantes à convertir en décimal.
(6* 16^0)+(7 * 16^1)+(0*16^2)+(3*16^3)=6 + 112+ 0 + 12288 = 12406
Donc, SI j'ai le caractère basé sur la version de "0x3076" et aussi, SI je suis en mesure d'obtenir chacun des personnages 6 - 7 - 0 - 3, je peux calculer les décimales montant!
Alors, j'ai décidé de diviser "3076" par 1000. J'étais attendu à trouver 3, mais j'ai eu DEUX caractères à la place! cependant, si j'étais en mesure d'obtenir 3 pour le reste de "307c" je ne suis pas en mesure d'obtenir un "C". Si c'était décimal ce serait pas hex!
Aussi, j'ai essayé "strtol
de la commande". Comme je l'ai utiliser Cygwin pour compiler mon code, je ne suis pas sûr de l'endroit où l'erreur est! Qu'ai-je fait de mal?
Donc, j'ai juste besoin de trouver un moyen d'obtenir CHAQUE caractère UNIQUE de l'HEX de données!
Aucune idée de s'il vous plaît?
P. S.
Voici mon code afin de vous aider à me donner une idée.
int get_readings(int source, int phase, int max_tries)
{
uint8_t buf[MAX_IEC1107_MSG_BODY];
uint8_t inbuf[MAX_IEC1107_MSG_BODY];
int inlen;
uint8_t *s;
int32_t value;
int status;
double voltage;
double current;
double active_power;
double reactive_power;
double apparent_power;
double power_factor;
double frequency;
s = buf;
*s++ = HOST_CMD_GET_READINGS_PHASE_1 + phase;
*s++ = 0x00;
if (max_tries != 1)
meter_set_max_tries(&emeter[source].meter_msg, max_tries);
if (meter_exchange(&emeter[source].meter_msg, buf, 2, inbuf, &inlen)
&&
inbuf[1] != 0xFF)
{
emeter[source].no_response = FALSE;
s = inbuf;
/* Get current readings */
value = (s[3] << 8) | s[2];
fprint(stderr, "value:" %p\n, value); //this give me HEX code
.
.
.
- Si le nombre est une variable de type entier, il n'est pas stockée dans l'hex. Vous êtes juste (sans doute?) l'impression que hex avec fprintf, à l'aide de l' %x spécificateur. Essayez d'imprimer les mêmes chiffres avec %u à la place.
- Vraiment vous devez poster votre code et votre exacte d'entrée et de sortie, si vous voulez savoir pourquoi c'est mal.
- Girouette; j'ai juste ajouté mon code. Merci!
- ooga: Quand j'utilise les autres que "%p", je vais obtenir un mauvais numéro! Comment puis-je savoir? Parce qu'il devrait me donner quelques chiffres autour de 120 V qui est ma tension!
Vous devez vous connecter pour publier un commentaire.
Lors de la lecture dans une chaîne de caractères représentant un nombre en hexadécimal, utilisez
strtol()
pour la convertir en une longue. Alors si vous voulez imprimer le nombre de décimales, utilisezprintf()
avec un%d
spécificateur de format.Une fois que vous lisez dans les cordes en tant que longs à l'aide de
strtol
et opérer sur les longs, les mathématiques doivent travailler de lui-même.LONG_MAX
. Sur les systèmes 32 bits habituellement, cela peut être un problème lors de la lecture des étiquettes RFID en hexa et en essayant de les convertir en lisible au format décimal.Seulement avec la ligne suivante j'ai pu résoudre le problème!
valeur a été montré que HEX comme j'avais l'habitude d'utiliser le %p! Puis j'ai changé pour x! et comme j'ai besoin d'avoir 124.06 pas 12406, en d'autres termes 2 décimales, ai-je ajouté .2f!
Merci à vous tous!
Vous confondez "entier" et "virgule", un "entier" est un numéro stocké dans un registre ou variable, tandis qu'une "virgule" est une chaîne de caractères représentant un nombre en base 10.
La conversion de l'hexadécimal en décimal est un processus en deux étapes. Vous devez d'abord le convertir en hexadécimal en entier (qui vous semblent l'avoir fait, avec votre "En théorie" de l'équation). Vous puis convertir un entier décimal.
Il y a beaucoup de façons de faire l'une de ces tâches,
strtol
etscanf
va le convertir en hexadécimal ou décimal à l'entier.printf
pouvez convertir entier soit hexedecimal ou décimal. Ou vous pouvez écrire vos propres routines de manipuler des personnages à faire une de ces choses.ch - '0'
vous permet de convertir le caractèrech
à un entier si c'est un chiffre décimal.ch - 'a' + 10
œuvres de chiffres hexadécimaux a..f1) pour impression seulement:
2) pour le calcul utilisation: