如何将十六进制转换为十进制?

时间:2015-06-26 18:35:53

标签: c cygwin hex 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,我可以计算小数![/ p>

所以,我决定将“3076”除以1000.我原本应该得到3,但我得到了两个字符!但是,如果我能够为“307c”的剩余部分获得3分,我将无法获得“C”。如果它是十进制的,这可能不起作用!

另外,我尝试了“strtol”命令。当我使用Cygwin编译我的代码时,我不确定错误在哪里!我做错了什么?

所以,我只需要找到一种方法从HEX数据中获取EACH SINGLE字符!

请问好吗?

P.S。

这是我的代码,以帮助您给我一个想法。

   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

。 。

5 个答案:

答案 0 :(得分:4)

当读取表示十六进制数字的字符串时,使用strtol()将其转换为long。然后,如果要打印十进制数字,请使用printf()格式说明符{。}}。

%d

一旦你使用char num[]="0x3076"; long n = strtol(num, NULL, 16); printf("n=%ld\n", n); // prints 12406 读取字符串并对长片进行操作,数学运算本身就可以解决。

答案 1 :(得分:1)

unsigned n;
sscanf("0x3076", "%x", &n);
printf("%u\n", n);

答案 2 :(得分:1)

只有以下一行才能解决问题!

fprintf(stderr, "Voltage: %.2f\n", value/100.00);

值显示为HEX,因为我以前使用%p!然后我改为x!因为我需要124.06而不是12406,换句话说2小数点,我加了.2f!

谢谢大家!

答案 3 :(得分:0)

令人困惑的是“整数”和“十进制” - “整数”是存储在寄存器或变量中的数字,而“十进制”是表示基数10中的数字的字符串。

因此,从十六进制转换为十进制是一个两步过程。您首先将十六进制转换为整数(您似乎已经使用“理论上的”方程式)将其转换为整数。然后,将整数转换为十进制。

有很多方法可以执行这些任务,strtolscanf会将十六进制或十进制转换为整数。 printf可以将整数转换为十六进制或十进制。或者你可以编写自己的例程来操纵角色来做其中任何一件事。

答案 4 :(得分:0)

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
}