十六进制转十进制 - C

浏览:
字体:
发布时间:2013-12-23 12:22:20
来源:

我们经常碰到16进制数转10进制的情况,使用下面的C程序即可完成上述工作。

那么他是怎样的工作原理呢?

6.2.5 十六进制数转换成十进制数 16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示 10,11,12,13,14,15。字母不区分大小写。十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。假设有一个十六进数 2AF5, 那么如何换算成10进制呢? 用竖式计算: 2AF5换算成10进制: 第0位:  5 * 160 = 5第1位:  F * 161 = 240第2位:  A * 162 = 2560第3位:  2 * 163 = 8192  +-------------------------------------                 10997 直接计算就是:(5 * 160 ) + (F * 161 ) + (A * 162 ) + (2 * 163)= 10997(别忘了,在上面的计算中,A表示10,而F表示15) 
注*


以此,程序的需要两部分组成:

1. 权值计算

16的几次方,power(16, x)

unsigned long power(int a, int b){  int i;  unsigned long result = 1;  for(i = 0; i < b; i++)  {    result *= a;  }  return result;};

2. 单16进制值转10进制值

例如:如果是F,则表示15

   switch (ch)    {		  case '0':			iCh = 0;			break;		  case '1':			iCh = 1;			break;		  case '2':			iCh = 2;			break;		  case '3':			iCh = 3;			break;		  case '4':			iCh = 4;			break;		  case '5':			iCh = 5;			break;		  case '6':			iCh = 6;			break;		  case '7':			iCh = 7;			break;		  case '8':			iCh = 8;			break;		  case '9':			iCh = 9;			break;		  case 'a':			iCh = 10;			break;		  case 'b':		   iCh = 11;			break;		  case 'c':		  	iCh = 12;			break;		  case 'd':		  	iCh = 13;			break;		  case 'e':		  	iCh = 14;			break;		  case 'f':		  	iCh = 15;			break;		  default:			iCh = -1;			break;	  }

为了满足,把所有输入转换为小写字母,可以使用系统函数tolower()或者我们自己写的函数toLower()

int toLower(int c){  if(c >= 'A' && c <= 'Z')  {     return c + 'a' - 'A';  } else {     return c;  }};

完整程序如下:

/* * hex2int.c * *  Created on: 2010-07-20 *      Author: xiaobin * */#include /* #include  */#include //#include /* int max is 32767 *//* "%d" only print int *//* long max is 2147483647 *//* "%ld" can print long type *//* unsigned long max is 4294967295 *//* "%lu" can print unsigned long type */#define MB 0x0100000ULunsigned long power(int a, int b);int toLower(int c);unsigned long htoi(char s[]);int main(int argc, char* argv[]){    if(argc > 1)        printf("long integer: %lu/n", htoi(argv[1]));    printf("M/Byte: %ld/n", MB);    return 0;}unsigned long htoi(char *s){    int i, len;    unsigned long value, result;    int iCh;    unsigned long iPow;    int pos;    char ch;    result = 0;    len = 0;    value = 0;    iCh = -1;    len = strlen(s);    pos = 0;    len -= 1;    for(i = len; (s[i] >= '0' && s[i] <= '9')                    || (s[i] >= 'a' && s[i] <= 'f')                    || (s[i] >= 'A' && s[i] <= 'F'); i--) {        ch = toLower(s[i]); /* tolower() defined in ctype.h */        switch (ch) {          case '0':            iCh = 0;            break;          case '1':            iCh = 1;            break;          case '2':            iCh = 2;            break;          case '3':            iCh = 3;            break;          case '4':            iCh = 4;            break;          case '5':            iCh = 5;            break;          case '6':            iCh = 6;            break;          case '7':            iCh = 7;            break;          case '8':            iCh = 8;            break;          case '9':            iCh = 9;            break;          case 'a':            iCh = 10;            break;          case 'b':           iCh = 11;            break;          case 'c':            iCh = 12;            break;          case 'd':            iCh = 13;            break;          case 'e':            iCh = 14;            break;          case 'f':            iCh = 15;            break;          default:            iCh = -1;            break;        }        iPow = power(16, pos);        pos++;        value = iPow * iCh;        result += value;    }    return result;};unsigned long power(int a, int b){    int i;    unsigned long result = 1;    for(i = 0; i < b; i++)        result *= a;            return result;};int toLower(int c){    if(c >= 'A' && c <= 'Z')        return c + 'a' - 'A';    else        return c;};


在CDT编译通过。


如有疑问请参考:《使用CDT+cygwin编写C/C++》

注*: 参考文章《第六章 二进制、八进制、十六进制》 - 第2学堂南郁


>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();