【问题标题】:How to convert Hexadecimal to Decimal?如何将十六进制转换为十进制?
【发布时间】:2015-09-13 19:24:56
【问题描述】:

我有不同的十六进制数据传入并存储到整数类型寄存器中。

当我使用 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

。 . .

【问题讨论】:

  • 如果数字在整数变量中,那么它不会以十六进制存储。您只是(大概?)使用 %x 说明符使用 fprintf 将其打印为十六进制。尝试使用 %u 打印相同的数字。
  • 如果你想知道为什么出错,你真的必须发布你的代码,以及你的确切输入和输出。
  • @Weather Vane;我刚刚添加了我的代码。谢谢!
  • @ooga:当我使用“%p”以外的时候,我会得到错误的数字!我怎么知道?因为它应该给我一些 120 V 左右的数字,这是我的电压!

标签: c cygwin hex decimal


【解决方案1】:

在读取表示十六进制数字的字符串时,使用strtol() 将其转换为长整数。然后,如果您想以十进制打印数字,请使用 printf()%d 格式说明符。

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

一旦您使用 strtol 将字符串读取为 long 并对 long 进行操作,数学应该会自行解决。

【讨论】:

  • @dbush & VBLUEPIXY 不幸的是这给了我 0!
  • @user3092919 我刚刚运行它并得到 12406。你的测试代码是什么样的?
  • 最多只能转换为LONG_MAX。在 32 位系统上,当读取 RFID 标签并尝试将其转换为人类可读的十进制格式时,这通常会成为问题。
  • 非常感谢@dbush 的回答。我有一个可能是新手的问题:为什么我们必须写char num[]="0x3076"; 而不仅仅是char num="0x3076";[] 是什么意思?
  • 字符串不是 C 中的类型。C 中的字符串被视为字符数组,因此是方括号。
【解决方案2】:
unsigned n;
sscanf("0x3076", "%x", &n);
printf("%u\n", n);

【讨论】:

    【解决方案3】:

    只有下面这行我才能解决问题!

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

    值显示为十六进制,因为我以前使用 %p!然后我换成x!因为我需要 124.06 而不是 12406,也就是说 2 个小数点,所以我添加了 .2f!

    谢谢大家!

    【讨论】:

      【解决方案4】:

      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
      }
      

      【讨论】:

        【解决方案5】:

        您混淆了“整数”和“十进制”——“整数”是存储在寄存器或变量中的数字,而“十进制”是表示以 10 为底的数字的字符串。

        因此,从十六进制转换为十进制需要两个步骤。您首先将十六进制转换为整数(您似乎已经使用您的“理论上”等式)。然后将整数转换为十进制。

        有很多方法可以完成这些任务,strtolscanf 会将十六进制或十进制转换为整数。 printf 可以将整数转换为十六进制或十进制。或者,您可以编写自己的例程来操纵角色来执行这些操作。

        【讨论】:

        • "一个“十进制”是一串字符"什么?您可能想在这里更新自己:en.wikipedia.org/wiki/Decimal_data_type#Standard_formats
        • @alk:这与我所说的完全一致——十进制数是表示以 10 为底的数字的字符串。如何在计算机上将这些字符编码为位是另一个问题。
        • @Chris:我还没有弄清楚如何将单个字符转换为十进制。剩下的会容易得多!
        • @user3092919:要将单个字符转换为整数,通常使用查找表——一个数字中只能出现 10 或 16 个有效(十六进制)字符。或者,如果您知道您的字符是 ASCII,您可以在 ascii 代码上使用算术运算——因此ch - '0' 会将字符 ch 转换为整数(如果它是十进制数字)。 ch - 'a' + 10 适用于十六进制数字 a..f
        猜你喜欢
        • 1970-01-01
        • 2013-10-08
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 2013-10-30
        • 1970-01-01
        相关资源
        最近更新 更多