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