[英]How to convert Hexadecimal to Decimal?
我要传入不同的十六进制数据并将其存储到整数类型寄存器中。
当我使用fprint时,我可以看到以下内容:
0x3076
0x307c
.
.
.
但是,我想显示上述十六进制数据的十进制版本,如下所示。
12406
12412
.
.
.
从理论上讲,假设您对第一个值执行以下操作以将其转换为十进制。
(6* 16^0)+(7 * 16^1)+(0*16^2)+(3*16^3)=6 + 112+ 0 + 12288 = 12406
因此,如果我有基于字符的版本“ 0x3076”,并且如果我能够获得每个字符6-7-0-3,则我可以计算小数位数!
因此,我决定将“ 3076”除以1000。本来我希望得到3,但我却得到了两个字符! 但是,如果我能在“ 307c”的其余部分中获得3,则不能获得“ C”。 如果是十进制,则可能无法使用十六进制!
另外,我尝试了“ strtol
”命令。 当我使用Cygwin编译代码时,我不确定错误在哪里! 我做错了什么?
因此,我只需要找到一种方法即可从HEX数据中获取每个字符!
有什么想法吗?
聚苯乙烯
这是我的代码,以帮助您给我一个想法。
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
。 。 。
读取表示十六进制数字的字符串时,请使用strtol()
将其转换为long。 然后,如果要以十进制格式打印数字,请使用带有%d
格式说明符的printf()
。
char num[]="0x3076";
long n = strtol(num, NULL, 16);
printf("n=%ld\n", n); // prints 12406
一旦使用strtol
将字符串读为long并对其进行运算,则数学运算应会自动完成。
unsigned n;
sscanf("0x3076", "%x", &n);
printf("%u\n", n);
只有使用以下行,我才能解决问题!
fprintf(stderr, "Voltage: %.2f\n", value/100.00);
我以前使用%p时,值显示为十六进制! 然后我换成了x! 并且因为我需要124.06而不是12406,换句话说,是2个小数点,所以我加了.2f!
谢谢你们!
您会混淆“整数”和“十进制”,“整数”是存储在寄存器或变量中的数字,而“十进制”是代表以10为底的数字的字符串。
因此,从十六进制转换为十进制是一个两步过程。 首先,将十六进制转换为整数(使用“理论上”的公式似乎已完成)。 然后,您将整数转换为十进制。
有许多方法可以执行这些任务, strtol
和scanf
会将十六进制或十进制转换为整数。 printf
可以将整数转换为十六进制或十进制。 或者,您可以编写自己的例程来操纵字符以完成上述任一操作。
1)仅用于打印:
#include <stdio.h>
#include <stdlib.h>
int main(){
int a=0;
scanf("%x",&a);
printf("%d\n",a);
system("pause");
return 0;
}
2)用于计算用途:
#include<stdio.h>
#include<stdlib.h>
int CharToDec(char c){
if(c>='0' && c<='9') return c-'0';
if(c>='a' && c<='f') return c-'a'+10;
if(c>='A' && c<='F') return c-'A'+10;
return 0;
}
int main(int argc, char *argv[]){
char H[10];
char *P;
int p=1,d=0;
printf("Entrez Hexadecimale nombre:");
scanf("%s",H);
for(P=H;*P;P++);
for(P--;P>=H;P--){
d = d + (CharToDec(*P) * p);
p = p*16;
}
printf("%d\n",d);
system("pause");
return 0
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.