如何在 C 中将这些十六进制值转换为十进制

How to convert these hex values to decimal in C

我有一个 C 语言的文本文件,其中包含以下格式的十六进制值:

   F4 C3 56 78 A3

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

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

我该怎么做?

谢谢

与 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 [=10=] 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; 
} 
#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

这里还有一个版本,和我们手动计算十六进制数到十进制的方法一样。

#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; 
}