【问题标题】:How to convert these hex values to decimal in C如何在C中将这些十六进制值转换为十进制
【发布时间】:2020-12-01 15:29:30
【问题描述】:

我有一个 C 文本文件,其中包含这种格式的十六进制值:

   F4 C3 56 78 A3

我想将这些十六进制数字的十进制等值存储到一个无符号字符*数组中。

我知道如何将十六进制值加载到数组中,但不知道如何将它们转换为十进制。

我该怎么做?

谢谢

【问题讨论】:

  • 请显示minimal reproducible example,准确的输入和输出值。
  • " 尝试使用 scanf 几个小时" 和 “%x” --> 使用常规引号:"%x",而不是智能引号。如果这是一个错字,请发布真实代码,minimal reproducible example
  • scanf 从标准输入 stdin 读取,而不是从我们想要的任何地方读取
  • 提示:启用所有警告。使用“(x 是一个 int array[])”和scanf(&buffer[i], "%x", &x[i]);,一个好的编译器会警告类型不匹配。
  • 每个十六进制数在缓冲区中占用 3 个字符,而不是 1 个。对于字符串,您需要 sscanf 而不是 scanf. 并且您可能使数组无符号。首先你可以试试这个:sscanf(&buffer[3*i], "%x", &x[i]);

标签: c hex decimal


【解决方案1】:

与 sscanf et prinf 混合可以完成这项工作。

#include <stdio.h>

bool isHexaDigit(char p) {
    return (( '0' <= p && p <= '9' ) || ( 'A' <= p && p <= 'F'));
}

int main(int argc, char** argv) 
{ 
    char t[]="F4 C3 FF 00 78 A3";
    char* p = t;
    char val[3]; // 2 hexa digit 
    val[2] = 0;  //and the final \0 for a string
    int number; 
    
    while (isHexaDigit(*p) && isHexaDigit(*(p+1))) {
            val[0] = *p;
            val[1] = *(p+1);

            sscanf(val,"%X", &number);    // <---- Read hexa string into number
            printf("\nNum=%i",number);    // <---- Display number to decimal.
              
            p++;
            p++;
            if (!*p) break;
            p++;
      }
   return 0; 
} 

【讨论】:

    【解决方案2】:
    #include <stdio.h>
    
    int main(void) {
        char* txt = "F4 C3 56 78 A3";
        do
        {
            unsigned char value = strtol(txt, &txt, 16);
            printf("Value is %3u : 0x%2X\n", value, value);
        } while (*txt);
        
        
        return 0;
    }
    

    输出

    Success #stdin #stdout 0s 4180KB
    Value is 244 : 0xF4
    Value is 195 : 0xC3
    Value is  86 : 0x56
    Value is 120 : 0x78
    Value is 163 : 0xA3
    

    【讨论】:

      【解决方案3】:

      这是另一个版本,它的完成方式与我们手动将十六进制数计算为十进制的方式相同。

      #include <stdio.h>
      #include <string.h>
      
      int hexTodec(char hexNum[]);
      
      int main(){
      
          char str[] = "F4 C3 56 78 A3";
          char* hnum = NULL;
          
          printf("original num is : %s \n", str);
          
          hnum = strtok(str," ");
      
          while(hnum != NULL)
          {
              printf("hnum = %s ", hnum);
              printf("decNum = %d\n", hexTodec(hnum));
              hnum = strtok(NULL," ");
          }
          return 0;
      }
      
      int hexTodec(char hexNum[])
      {    
          int i = 0;
          int base = 1; 
          int decNum = 0; 
      
          i = strlen(hexNum) - 1; 
      
          while( i >= 0 )
          {    
              if ( hexNum[i] >= '0' && hexNum[i] <= '9') 
              { 
                  //(48)10 is ascii of 0 and (30)16
                  decNum += (hexNum[i] - 48) * base;
                  base = base * 16; 
              } 
              else if (hexNum[i] >= 'A' && hexNum[i] <= 'F') 
              { 
                  //(A)16 is 10, but 'A' is (65)10 so, to get 10 subtract 55 
                  decNum += (hexNum[i] - 55) * base;
                  base = base * 16; 
              } 
              i--;
          } 
          return decNum; 
      } 
      
      

      【讨论】:

        猜你喜欢
        • 2011-08-04
        • 2017-07-31
        • 2013-07-20
        • 2012-06-17
        • 2023-03-31
        • 2014-02-05
        • 2021-06-26
        • 1970-01-01
        相关资源
        最近更新 更多