ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

十六进制转十进制C语言代码实现

十六进制转十进制C语言代码实现

本文章主要讲解:

将输入的十六进制数转化为十进制数的C语言代码实现过程

知识较为基础,若有不足请各位多多指教

首先给出完整实现代码:

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define weishu 8 int main() { int a = 0; int result = 0; int b = 0; char hex[weishu]; printf("Please input:");//这里用来引导用户输入一个十六进制数字 again: scanf("%s", hex);//用scanf函数来接收十六进制数字 int len = strlen(hex);//此处获取数组hex的字符长度 int len1 = len; len = len - 1; len1 = len1 - 1; int num = len1; while (len > -1) { if (hex[len] >= '0' && hex[len] <= '9') hex[len] = hex[len] - '0'; else if (hex[len] >= 'a' && hex[len] <= 'f') hex[len] = hex[len] - 'a' + 10; else if (hex[len] >= 'A' && hex[len] <= 'F') hex[len] = hex[len] - 'A' + 10; else { printf("Input error,please re-enter:"); goto again; } len--; } int x = len1 + 1; if (x % 2 == 0) { int len2 = len1; int x2 = 0; int x1 = x / 2; for (x1 ; x1 > 0;x1--) { int mid = hex[x2]; int mid1 = hex[len2]; hex[len2]=mid; hex[x2] = mid1; x2++; len2--; } } else { int len3 = len1; int x3 = 0; int x4 = (x + 1) / 2; for (x4;x4 > 0;x4--) { int mid2 = hex[x3]; int mid3 = hex[len3]; hex[len3] = mid2; hex[x3] = mid3; x3++; len3--; } } while (len1>-1) { result = result + hex[len1] * pow(16, len1); len1--; } printf("Ouput:%d", result);//输出十进制结果 return 0; }

一些关于以上代码的相关知识:

1.十六进制数字的相关知识:

十六进制数字逢16进1,然而如果用纯数字的话,在某一位数到达‘ 9 ’的时候,下一位如果写成‘10’会产生歧义,因此在‘9’之后,十六进制数字用字母来表示该位数的数字:
10 -->a或A
11 -->b或B
12 -->c或C
13 -->d或D
14 -->e或E
15 -->f或F

例如用十六进制数字表示十进制数字 ‘ 31 ’:
31=16+15
则15 -->f或F
剩下的16进1
则用16进制表示为:1f或1F

2.对于strlen函数:

例如输入’ 1f ’
则此时hex数组中所含字符则为’1’ , ’ f ’ 以及 ‘\0’
又由于strlen函数不计算 ‘/0’
因此strlen(hex)=2;

3.十六进制数字存入数组并转化为十进制数字转化代码实现过程:

#define weishu 8 char hex[weishu]; scanf("%s", hex);//用scanf函数来接收十六进制数字 int len = strlen(hex);//此处获取数组hex的字符长度 int len1 = len; len = len - 1; len1 = len1 - 1; while (len > -1) { if (hex[len] >= '0' && hex[len] <= '9') hex[len] = hex[len] - '0'; else if (hex[len] >= 'a' && hex[len] <= 'f') hex[len] = hex[len] - 'a' + 10; else if (hex[len] >= 'A' && hex[len] <= 'F') hex[len] = hex[len] - 'A' + 10; else { printf("Input error,please re-enter:"); goto again; }

首先需要知道:
字符的加减是用对应的ASCII码值进行加减的。

通过这一点,我们就可以知道:
当某一位数只在0~9之间时,用该位数的字符减去‘0’,
即可得到十进制的该位数字。

然而当某位数是大于9的字母时,用常规的减‘0’
就不能算出对应的十进制数字了。

这时就得用其他方法来进行计算了。

else if (hex[len] >= 'a' && hex[len] <= 'f') hex[len] = hex[len] - 'a' + 10; else if (hex[len] >= 'A' && hex[len] <= 'F') hex[len] = hex[len] - 'A' + 10;

这里给出了当位数为字母时将其转化为十进制数字的方法:
减去‘a’或’A’再加10

由此就将一个十六进制数字的各位数转化为对应十进制并存入数组了!

4.数组相关知识:

数组的编号由0开始,以’ 1f '为例:
此时数组hex里各编号字符的情况为:

char hex[8]={‘1’,‘f’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’,‘\0’} (其余未初始化的值都默认为’\0’)
则此时hex[0]=‘1’,hex[1]=‘f’
最高编号为1,而此时计算的字符长度为2
因此将len-1,以便能够正确计算

5.转化为十进制时转化正常位数顺序方法:

int x = len1 + 1; if (x % 2 == 0) { int len2 = len1; int x2 = 0; int x1 = x / 2; for (x1 ; x1 > 0;x1--) { int mid = hex[x2]; int mid1 = hex[len2]; hex[len2]=mid; hex[x2] = mid1; x2++; len2--; } } else { int len3 = len1; int x3 = 0; int x4 = (x + 1) / 2; for (x4;x4 > 0;x4--) { int mid2 = hex[x3]; int mid3 = hex[len3]; hex[len3] = mid2; hex[x3] = mid3; x3++; len3--; } }

这里通过检测输入十六进制数字的位数将其进行倒序并存入数组,由此进行后续计算。

6.十六进制转十进制相加算法:

while (len1>-1) { result = result + hex[len1] * pow(16, len1); len1--; } printf("Ouput:%d", result);//输出十进制结果

这里通过将对应位数数字乘以16的对应次方,将各结果相加,相加结果就是对应的十进制结果了!

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进