如何在 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;
}
我有一个 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;
}