如何转换十六进制到十进制?(How to convert Hexadecimal to Decima

2019-10-23 12:58发布

我有不同的十六进制数据来了,并存储成一个整数型寄存器。

当我使用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,但我有两个字符,而不是! 但是,如果我能得到3对的“307C”剩我没能获得“C”。 如果是十进制这可能工作不是十六进制!

另外,我想“ strtol ”命令。 当我使用Cygwin编译我的代码,我不知道哪里出错! 我做错了什么?

所以,我只需要找到一种方式来获得的每一个字符出来的HEX数据!

任何想法吗?

PS

下面是我为了帮你给我一个想法代码。

   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

。 。 。

Answer 1:

当代表十六进制数字的字符串读取,使用strtol()将其转换为长。 然后,如果你要打印十进制数,使用printf()%d格式说明。

char num[]="0x3076";
long n = strtol(num, NULL, 16);
printf("n=%ld\n", n);  // prints 12406

一旦你为使用多头在串读strtol和多头操作,算算应该工作本身了。



Answer 2:

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


Answer 3:

只有具备以下行,我可以解决这个问题!

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

值显示为十六进制为我所用%P! 然后,我改变为x! 当我需要有124.06不是12406,也就是说2位小数,我加.2f!

谢谢你们!



Answer 4:

你感到困惑“整数”和“小数” - 一个“整数”被存储在寄存器或变量的数,而“小数”是表示在基体10的数个字符的字符串。

因此,从十六进制转换为十进制是一个两步骤的过程。 你先转换成十六进制整数(你似乎已经完成,你的“理论上”方程)。 然后,您可以转换成整数为十进制。

有很多方法可以做到这两种任务, strtolscanf将十六进制或十进制转换为整数。 printf可整数转换要么hexedecimal或十进制。 或者你可以编写自己的程序操纵角色做任何的这些东西。



Answer 5:

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
}


文章来源: How to convert Hexadecimal to Decimal?