简体   繁体   English

怎么把十六进制转换成十进制?

[英]How to convert Hexadecimal to Decimal?

I have different hexadecimal data are coming and stored into an integer type register. 我要传入不同的十六进制数据并将其存储到整数类型寄存器中。

When I use fprint I can see the following: 当我使用fprint时,我可以看到以下内容:

0x3076
0x307c
.
.
.

However, I would like to show a Decimal version of above-mention Hex data as follows. 但是,我想显示上述十六进制数据的十进制版本,如下所示。

12406
12412
.
.
.

In theory, let's say for the first value you do the following to convert it to decimal. 从理论上讲,假设您对第一个值执行以下操作以将其转换为十进制。

(6* 16^0)+(7 * 16^1)+(0*16^2)+(3*16^3)=6 + 112+ 0 + 12288 = 12406

So IF I have the character-based version of "0x3076" and also, IF I am able to get each single characters 6 - 7 - 0 - 3, I can calculate the decimal amount! 因此,如果我有基于字符的版本“ 0x3076”,并且如果我能够获得每个字符6-7-0-3,则我可以计算小数位数!

So, I decided to divide "3076" by 1000. I was expected to get 3, but I got TWO characters instead! 因此,我决定将“ 3076”除以1000。本来我希望得到3,但我却得到了两个字符! however, if I was able to get 3 for the remainder of "307c" I am not able to get "C". 但是,如果我能在“ 307c”的其余部分中获得3,则不能获得“ C”。 If it was decimal this might work not hex! 如果是十进制,则可能无法使用十六进制!

Also, I tried " strtol " command. 另外,我尝试了“ strtol ”命令。 As I use Cygwin to compile my code, I am not sure where the error is! 当我使用Cygwin编译代码时,我不确定错误在哪里! What did I do wrong? 我做错了什么?

So, I just need to find a way to get EACH SINGLE character out of the HEX data! 因此,我只需要找到一种方法即可从HEX数据中获取每个字符!

Any idea please? 有什么想法吗?

PS 聚苯乙烯

Here is my code in order to help you to give me an idea. 这是我的代码,以帮助您给我一个想法。

   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

. . .

When reading in a string representing a number in hexadecimal, use strtol() to convert it to a long. 读取表示十六进制数字的字符串时,请使用strtol()将其转换为long。 Then if you want to print the number in decimal, use printf() with a %d format specifier. 然后,如果要以十进制格式打印数字,请使用带有%d格式说明符的printf()

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

Once you read in the strings as longs using strtol and operate on the longs, the math should work itself out. 一旦使用strtol将字符串读为long并对其进行运算,则数学运算应会自动完成。

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

Only with the following line I could solve the issue! 只有使用以下行,我才能解决问题!

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

value was shown as HEX as I used to use %p! 我以前使用%p时,值显示为十六进制! Then I changed to x! 然后我换成了x! and as I need to have 124.06 not 12406, in other words 2 decimal points, I added .2f! 并且因为我需要124.06而不是12406,换句话说,是2个小数点,所以我加了.2f!

Thank you all! 谢谢你们!

You are confusing "integer" and "decimal" -- an "integer" is a number stored in a register or variable, while a "decimal" is a string of characters that represent a number in base 10. 您会混淆“整数”和“十进制”,“整数”是存储在寄存器或变量中的数字,而“十进制”是代表以10为底的数字的字符串。

So converting from hexadecimal to decimal is a two-step process. 因此,从十六进制转换为十进制是一个两步过程。 You first convert the hexadecimal to integer (which you appear to have done, with your "In theory" equation). 首先,将十六进制转换为整数(使用“理论上”的公式似乎已完成)。 You then convert the integer to decimal. 然后,您将整数转换为十进制。

There are lots of ways to do either of these tasks, strtol and scanf will convert either hexadecimal or decimal to integer. 有许多方法可以执行这些任务, strtolscanf会将十六进制或十进制转换为整数。 printf can convert integer to either hexedecimal or decimal. printf可以将整数转换为十六进制或十进制。 Or you can write your own routines that manipulate characters to do either of these things. 或者,您可以编写自己的例程来操纵字符以完成上述任一操作。

1) for printing only: 1)仅用于打印:

#include <stdio.h>
#include <stdlib.h>

int main(){
  int a=0;
  scanf("%x",&a);
  printf("%d\n",a);
  system("pause");
  return 0;
}

2) for calculation use: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM