博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个快速将十六进制串转十进制数的方法
阅读量:4673 次
发布时间:2019-06-09

本文共 1187 字,大约阅读时间需要 3 分钟。

    今天看到一段将十六进制数的字符转十进制的代码,写得太精妙了。我就又占了前辈们的光,在其基础上扩充了一下,写了个将十六进制字符串
转十进制数的接口,和大家分享分享。

点击(此处)折叠或打开

  1. /******************************hex2digit.c*****************************************/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define HEXTD(x) (((x)<='9')?((x)-'0'):(((x)&7)+9))  //这就是那段精妙的核心代码
  1. /* hex_to_digit:将一个由字符串表示的十六进制字串转换成其对应的十进制数
  2.  * 输入: src 十六进制的字串。
  3.  * 输出: sum 用于接收转换后的结果。
  4.  * 返回值: -1 表示输入的数据有错误;-2 表示输入字串中有非法的字符; 0 表示转换成功。
  5.  */
  1. int hex_to_digit(unsigned int *sum,char* src){
  2.     if(!src || !sum || strlen(src) == 0)
  3.         return -1;
  4.     *sum ^=*sum;
  5.     while(src && *src!='\0'){
  6.         if(!((*src>='0')&&(*src<='9'))&&!((*src>='a')&&(*src<='f'))&&!((*src>='A')&&(*src<='F')))
  7.                 return -2;
  8.         *sum = ((*sum << 4) | HEXTD(*src));
  9.         src++;
  10.     }
  11.     return 0;
  12. }
  13. int main(int argc,char** argv){
  14.     unsigned int a;
  15.     int ret = hex_to_digit(&a,argv[1]);
  16.     if(ret==-1)
  17.         printf("input error!\n");
  18.     else if(ret==-2)
  19.         printf("illegal letter in string!\n");
  20.     else
  21.         printf("Result is : %lu\n",a);
  22.     return 0;
  23. }
    编译运行,其结果如下:
   上述接口还存在有待优化和完善的地方,例如是否可以支持形如"0x804Ed...
"这样的十六进制串.
在32为系统上,可以表示的最大无符号整形是
2
32
-1= 4294967295,如果想表示更大的数可以用unsigned long long 型等等.
   这个程序没有做过充分的测试,不足之处恳请各位予以指正,谢谢。

转载于:https://www.cnblogs.com/masterpanda/p/5700459.html

你可能感兴趣的文章
MongoDB副本集配置系列六:定位MongoDB慢的原因
查看>>
[EGORefreshTableHeaderView]手动启动下拉更新的方法
查看>>
Linux磁盘分区/格式化/挂载目录
查看>>
raspberry pi下使用mp3blaster播放mp3音乐
查看>>
[转]win7 64位下android开发环境的搭建
查看>>
mysql 无法链接, 输入密码失败
查看>>
java中enum类型的使用
查看>>
枚举类型转换成字符串
查看>>
(剑指Offer)面试题46:求1+2+3+....+n
查看>>
连续子数组的最大和(基于动态规划)
查看>>
Word Search
查看>>
三:背包DP
查看>>
Nikto学习点
查看>>
OSi七成模型 tcp/ip网络模型
查看>>
初学python之路-day15
查看>>
Linux内核分析——进程的描述和进程的创建
查看>>
【C++自我精讲】基础系列三 重载
查看>>
企业级docker私有仓库的配置与使用
查看>>
ireport5.6+jasperreport6.3开发(四)--以javabean为基准的报表开发(ireport)
查看>>
Spring面试底层原理的那些问题,你是不是真的懂Spring?
查看>>