簡體   English   中英

怎么把十六進制轉換成十進制?

[英]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為底的數字的字符串。

因此,從十六進制轉換為十進制是一個兩步過程。 首先,將十六進制轉換為整數(使用“理論上”的公式似乎已完成)。 然后,您將整數轉換為十進制。

有許多方法可以執行這些任務, strtolscanf會將十六進制或十進制轉換為整數。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM