點擊(此處)摺疊或打開
- /******************************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;
- }
這個程序沒有做過充分的測試,不足之處懇請各位予以指正,謝謝。
wjlkoorey2582013-04-10 22:14:00
Bean_lee:我記得有本書是專門講這種技巧的。大神John Carmack當年也有很神奇的magic number的故事。
不過,我覺得如果這些工作應該交給編寫底層庫的人去做,如果我們每個人都要考慮這麼多,就太累了。
我也是看源碼時看到的,所以就記錄下來了。因爲自己以前寫過這麼一個接口,現在感覺那是相當的挫啊,呵呵
回覆 | 舉報