嵌入式AIoT君

我是一名嵌入式-人工智能小白,从入门到出师,开始我的新一段征程。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

进制转换: 16进制转为10进制

  1 C风格的转换操作
  2 使用C语言来完成这个任务,将十进制数转换为十六进制数时使用sprinf(),而将十六进制数转换为十进制数时使用strtol(),示例如下:
  3 #include<stdio.h>
  4 #include<stdlib.h>
  5 int main()
  6 {
  7     /****** Convert decimal to hex ********/
  8     int a;
  9     printf("Enter a decimal number:");
 10     scanf("%d",&a);
 11     char ch[10]={0,};
 12     sprintf(ch,"%X",a);
 13     printf("Convert to hex:%s\n",ch);
 14     /****** Convert hex to decimal ********/
 15     char hex[10] = {0,};
 16     long int decimal;
 17     printf("Enter a hex number:");
 18     scanf("%s",hex);
 19     decimal = strtol(hex,NULL,16);
 20     printf("Convert to decimal:%ld\n",decimal);
 21     return 0;
 22 }
 23 假设上面的程序保存在test.c文件中,下面来测试这个程序:
 24 $ gcc test.c && ./a.out  
 25 Enter a decimal number: 30  
 26 Convert to hex: 1E  
 27 Enter a hex number: 1E  
 28 Convert to decimal: 30
 29 C++风格的转换操作
 30 使用C++来完成这个任务,将十进制数转换为十六进制数,和将十六进制数转换为十进制数,都是使用stringstream类来完成,这个类包含来<sstream>头文件中.
 31 #include<iostream>
 32 #include<sstream>
 33 #include<string>
 34 using std::cin;
 35 using std::endl;
 36 using std::cout;
 37 using std::string;
 38 using std::stringstream;
 39 using std::hex;
 40 int main()
 41 {
 42     /********Convert hex to decimal***********/
 43     int decimal;
 44     string str;
 45     stringstream ss;
 46     cout<<"Enter a hex number:";
 47     cin>>str;
 48     ss.str(str);
 49     ss>>hex>>decimal;
 50     cout<<"Convert to decimal:"<<decimal<<endl;
 51     /********Convert decimal to hex*********/
 52     cout<<"Enter a decimal number:";
 53     cin>>decimal;
 54     ss<<hex<<decimal;
 55     cout<<"Convert to hex:"<<ss.str()<<endl;
 56     return 0;
 57 }
 58 假设上面的程序保存在test.cxx文件中,下面来测试这个程序:
 59 $ g++ test.cxx && ./a.out
 60 Enter a hex number: 1E
 61 Convert to decimal: 30
 62 Enter a decimal number: 30
 63 Convert to hex: 1E
 64 总结:都是将十进制数转换为一个十六进制的数值字符串;而在做十六进制向十进制的转换时,也都是将一个十六进制的数值字符串转换为十进制数。
 65 
 66 函数介绍:long int strtol(const char *nptr, char **endptr, int base)
 67 strtol()会将nptr指向的字符串,根据参数base,按权转化为long int, 然后返回这个值。
 68 参数base的范围为2~36,和0;它决定了字符串以被转换为整数的权值。
 69 可以被转换的合法字符依据base而定,举例来说,当base为2时,合法字符为‘0’,‘1’;
 70     base为8时,合法字符为‘0’,‘1’,……‘7’;
 71     base为10时,合法字符为‘0’,‘1’,……‘9’;
 72     base 为16时,合法字符为‘0’,‘1’,……‘9’,‘a’,……‘f’;
 73     base为24时,合法字符为‘0’,……‘9’,‘a’,……‘n’,
 74     base为36时,合法字符为‘0’,……‘9’,‘a’,……‘z’;等等。其中,不区分大小写,比如,‘A’和‘a’会都会被转化为10。
 75 当字符合法时,‘0’,……‘9’依次被转换为十进制的0~9,‘a’,……‘z’一次北转换为十进制的10~35 76 strtol()函数检测到第一个非法字符时,立即停止检测,其后的所有字符都会被当作非法字符处理。合法字符串会被转换为long int, 作为函数的返回值。非法字符串,即从第一个非法字符的地址,被赋给*endptr。**endptr是个双重指针,即指针的指针。strtol()函数就是通过它改变*endptr的值,即把第一个非法字符的地址传给endptr。
 77 多数情况下,endptr设置为NULL, 即不返回非法字符串。
 78 下面看几个例子:
 79 ------------------------------------------------------
 80 char buffer[20]="10379cend$3";
 81 char *stop;
 82 printf("%d\n",strtol(buffer, &stop, 2));
 83 printf("%s\n", stop);
 84 输出结果:
 85 2
 86 379cend$3
 87 -------------------------------------------------------
 88 char buffer[20]="10379cend$3";
 89 char *stop;
 90 printf("%d\n",strtol(buffer, &stop, 8));
 91 printf("%s\n", stop);
 92 输出结果:
 93 543
 94 9cend$3
 95 --------------------------------------------------------
 96 char buffer[20]="10379cend$3";
 97 char *stop;
 98 printf("%d\n",strtol(buffer, &stop, 10));
 99 printf("%s\n", stop);
100 输出结果:
101 10379
102 cend$3
103 -------------------------------------------------------
104 char buffer[20]="10379cend$3";
105 char *stop;
106 printf("%d\n",strtol(buffer, &stop, 16));
107 printf("%s\n", stop);
108 输出结果:
109 17005006
110 nd$3
111 另外,如果base为0,且字符串不是以0x(或者0X)开头,则按十进制进行转化。如果base为0或者16,并且字符串以0x(或者0X)开头,那么,x(或者X)被忽略,字符串按16进制转化。如果base不等于0和16,并且字符串以0x(或者0X)开头,那么x被视为非法字符。
112 例如:
113 -------------------------------------------------------
114 char buffer[20]="0x31da6c";
115 char *stop;
116 printf("%d\n",strtol(buffer, &stop, 0));
117 printf("%s\n", stop);
118 输出结果(stop为空):
119 3267180
120 -------------------------------------------------------
121 char buffer[20]="0x31da6c";
122 char *stop;
123 printf("%d\n",strtol(buffer, &stop, 13));
124 printf("%s\n", stop);
125 输出结果:
126 0
127 0x31da6c
128 -------------------------------------------------------
129 最后,需要说明的是,对于nptr指向的字符串,其开头和结尾处的空格被忽视,字符串中间的空格被视为非法字符。
130 例如:
131 -------------------------------------------------------
132 char buffer_1[20]="10379c";
133 char buffer_2[20]="      10379c        ";
134 char buffer_3[20]="      10      379c        ";
135 printf("%d\n",strtol(buffer_1,NULL,0));
136 printf("%d\n",strtol(buffer_2,NULL,0));
137 printf("%d\n",strtol(buffer_3,NULL,0));
138 输出结果为:
139 10379
140 10379
141 10

 

posted on 2023-04-11 00:02  孔实  阅读(13)  评论(0编辑  收藏  举报